gpt4 book ai didi

c - 为什么在转换 const 双索引参数时会收到 -Wincompatible-pointer-types 警告但是

转载 作者:太空狗 更新时间:2023-10-29 16:56:38 25 4
gpt4 key购买 nike

为什么使用 gcc5 (5.3.0) 编译下面的最小测试用例 C 代码会为具有 const 参数的 warning() 函数调用生成 [-Wincompatible-pointer-types] 警告并使用 ConstMyDouble 转换该参数typedef,但不适用于不使用 ConstMyDouble 转换的 nowarning() 调用,也不适用于使用非常量 typedef MyDouble 的 noconst() 调用,如何修复?

在 typedef 中使用 [const] 并且 typedef 用于将参数转换为函数时,似乎有一个微妙之处。

最令人困惑的部分是警告信息:

minimal.c:17:7: note: expected ‘const double (*)[2]’ but argument is
of type ‘const ConstMyDouble (*)[2] {aka const double (*)[2]}’

这似乎是说 const double (*)[2] 与 (aka) const double (*)[2] 不同

最小的 C 代码测试用例

/* Usage:
*
* ./minimal ; echo ${PIPESTATUS[0]}
* => echo command will output 99 (BASH)
*
* Compile and link, default:
*
* gcc5 minimal.c -o minimal
* => Casts argument to minimal to [ConstMyDouble], a typedef
* => Generates [-Wincompatible-pointer-types] warnings
*
*/
typedef double MyDouble;
typedef const double ConstMyDouble;

int noconst( MyDouble matrix[2][2] ) { return 32; }
int warning( ConstMyDouble matrix[2][2] ) { return 33; }
int nowarning( ConstMyDouble matrix[2][2] ) { return 34; }

int main() {
MyDouble matrix[4];
return noconst(( MyDouble (*)[2])(matrix)) /* No warning */
+ nowarning(( const double (*)[2])(matrix)) /* No warning */
+ warning((ConstMyDouble (*)[2])(matrix)) /* Warning */

背景和杂项

我知道我可以通过 [-Wincompatible-pointer-type] 选项关闭警告,但这是一个最小的测试用例,并不代表我在实践中遇到的情况。

在实践中,这些警告是因为我使用的库中有类似的 typedef 和强制转换 (https://naif.jpl.nasa.gov/),所以我想知道如何解决它减少噪音,足以从我自己的代码中看到此类警告。

我使用的是 GCC 5.3.0; GCC 4.4.7 不会出现这些警告。

这只是一个最小的测试用例; noconst()、nowarning() 和 warning() 函数对参数不做任何操作应该无关紧要。

我认为这与 Strange warning in a C function const multidimensional-array argument 有关,或者其他人,但这里的问题似乎是使用 typedef 与不在转换中使用 typedef。不过,如果这是重复的,我深表歉意并将其删除。

最佳答案

您的问题中的评论者确认似乎存在编译器错误,实际上是@ zowl显然已检查该错误仅出现在 GCC 5.3.0 中,如 in this comment 所述.

用户@ liliscent使用了 clang 编译器,它也没有生成警告,如 this other comment 中所述。 .

因此,GCC 5.3.0 中存在错误的结论似乎是有效的。

关于c - 为什么在转换 const 双索引参数时会收到 -Wincompatible-pointer-types 警告但是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49056641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com