常量限定符上的GCC警告是否正确?

常量限定符上的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

考虑以下代码,其产生于:

当出现以下情况时,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: 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; } ^~~~~~~~~~~~~~~~