我有这样的代码:

$ 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/

10-11 18:51