我有这样的代码:
$ cat test.c
#include <stdio.h>
typedef struct
{
const int x;
} SX;
static SX mksx(void)
{
return (SX) { .x = 10 };
}
void fn(void)
{
SX sx;
while((sx = mksx()).x != 20)
{
printf("stupid code!");
}
}
关于它的正确性有2条意见:
$ for i in gcc clang; do echo "$i SAYS:"; $i -c -std=c99 -pedantic -Werror test.c; done
gcc SAYS:
test.c: In function ‘fn’:
test.c:15:2: error: assignment of read-only variable ‘sx’
while((sx = mksx()).x != 20)
^
clang SAYS:
哪个编译器是正确的?
最佳答案
C99标准在6.5.16:2中指出:
并在6.3.2.1:1中:
因此,GCC发出警告是正确的。
另外,第6.5.16:2节在C99标准的“约束”部分中,因此需要合格的编译器为破坏该条款的程序发出诊断信息。仍然是未定义的行为:发出诊断信息后,编译器仍可以执行所需的操作。但是必须有一个信息。因此,Clang在这里的行为不合格。
关于c - 在const结构字段上,哪个C99编译器(Clang vs. GCC)更接近标准?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18527984/