常量限定符上的GCC警告是否正确?
考虑以下代码,其产生于: 当出现以下情况时,GCC警告: source>:2:15: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual] { return (const int (*)[1]) a; } ^ 然后警告消失了。如果我们将常量限定符上的GCC警告是否正确?,c,gcc,language-lawyer,C,Gcc,Language Lawyer,考虑以下代码,其产生于: 当出现以下情况时,GCC警告: source>:2:15: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual] { return (const int (*)[1]) a; } ^ 然后警告消失了。如果我们将-pedantic添加到编译开关中,我们会得到一个关于const的不同警告: source>:2:15: warni
-pedantic
添加到编译开关中,我们会得到一个关于const
的不同警告:
source>:2:15: warning: return discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
{ return (const void *) a; }
^~~~~~~~~~~~~~~~
source>:2:15:警告:从指针目标类型[-Wdiscarded限定符]返回丢弃的'const'限定符
{return(const void*)a;}
^~~~~~~~~~~~~~~~
这看起来像是相同的警告,只是它是关于从返回表达式到函数返回类型的隐含转换,而前面的警告是关于强制转换中的显式转换。但是这一个只出现在
-pedantic
中。为什么?这是我的错。GCC无法识别指向数组指针的强制转换保留常量限定符,这是因为应用于数组的限定符实际上应用于数组元素的复杂性。在我看来像是GCC错误?这里有一个版本,返回类型的typedef仍然显示了这个问题:纯推测:可能是您在问题中用“数组类型上的限定符应用于元素类型”确定了这个问题。GCC可能看到“指针指向(const char)”到“指针指向(数组的(const int))”,如果看到指向的对象不是常量,则会发出警告(如果它愿意再深入一层,则实际上仍然是常量)。注意:从指针更改为char
到int
调用对齐关注点。如果要验证我的假设,此警告是在gcc/c/c-typeck.c的handle\u warn\u cast\u qual
中生成的,位于两行,表示discarded |=(TYPE_QUALS\u NO\u ADDR\u SPACE(in_otype)和~TYPE_QUALS\u NO\u ADDR\u SPACE(in_TYPE))代码>。您必须在_otype
中挖掘,以查看它是否是数组类型,以及元素类型是否有其基。只读_标志
位设置。使用(int(*)[1])(const int(*)42强制转换常量
代码>或甚至typedef int T[1];(T*)(常数T*)42代码>对gcc和clang都没有警告。
const int (*foo(const char *a))[1]
{ return (const void *) a; }
source>:2:15: warning: return discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
{ return (const void *) a; }
^~~~~~~~~~~~~~~~