c/c++语言开发共享当非const参数作为const参数传递时,Intel C ++ Compiler警告167

我有一个很大的代码库,最近从Microsoft的编译器转移到了英特尔C ++编译器。 我们团队的目标是在主线上编辑而不发出警告。 自开关以来,警告167的一个实例让我感到困惑。 如果我编译以下代码:

int foo(const int pp_stuff[2][2]) { return 0; } int foo2(const int pp_stuff[][2]) { return 0; } int main(void) { int stuff[2][2] = {{1,2},{3,4}}; foo(stuff); foo2(stuff); return 0; } 

国际刑事法院会给我警告:

 1>main.c(17): warning #167: argument of type "int (*)[2]" is incompatible with parameter of type "const int (*)[2]" 1> foo(stuff); 1> ^ 1> 1>main.c(18): warning #167: argument of type "int (*)[2]" is incompatible with parameter of type "const int (*)[2]" 1> foo2(stuff); 

为什么这是一个警告? 通常的做法是将非const变量作为const参数传递,并且类型和尺寸是相同的。

对于那些标有重复问题的人,我恳请你重新考虑。 如果其他人遇到此警告,他们必须知道在C参数中转换就像在原型函数中通过赋值一样转换,然后搜索严格关于赋值的问题。 尽管答案最终是C90 / C99中的同一条款,但我认为问题非常不同。

    将变量传递给需要const的函数时,将变量转换为const。

     foo( (const int (*)[2]) stuff ); 

    为什么我不能将char **传递给期望const char **的函数?

    类似的问题

    stuff数组的值是int (*)[2]

     int foo(const int pp_stuff[2][2]) 

    相当于

     int foo(const int (*pp_stuff)[2]) 

    在函数调用中,就像将int (*)[2]类型的值赋给const int (*)[2]类型的变量一样。

    参数的转换就像在原型函数中赋值一样。 如果出现以下情况,C允许您分配两个指针:

    两个操作数都是指向兼容类型的限定或非限定版本的指针,左边指向的类型具有右边指向的所有类型的限定符;

    这里int (*)[2]const int (*)[2]不是相同类型的限定/非限定版本。 限定符适用于int而不是指针。

    使用:

     int foo(int (* const pp_stuff)[2]) 

    如果你想使指针const而不是int元素。

      以上就是c/c++开发分享当非const参数作为const参数传递时,Intel C ++ Compiler警告167相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/562245.html

      (0)
      上一篇 2021年2月4日
      下一篇 2021年2月4日

      精彩推荐