我正在使用以下标志(其中cc是gcc 4.2或clang 8.0):
$ cc -Wall -Werror -pedantic -ansi -std=c89 main.c
(我知道-ansi标志在这种情况下有些多余)
以下命令会给出预期的错误:
main.c:31:8: warning: ISO C90 forbids mixing declarations and code [-Wdeclaration-after-statement]
vec3 abc = {0};
int main()
{
vec3 a = {0};
vec3 b = {0};
Vec3(2, 2, 2);
vec3 abc = {0}; // Declared after a function call
return 0;
}
然而,以下内容并不符合要求。
int main()
{
vec3 a = Vec3(0, 1, 2);
vec3 b = Vec3(0, 1, 2);
vec3 abc = {0}; // Declared after a function call
return 0;
}
使用函数初始化变量仍然算作声明和代码的混合吗?
Vec3函数非常基础,没有设置内联标志等。
vec3 Vec3(float x, float y, float z)
{
vec3 rtn = {0};
rtn.x = x;
rtn.y = y;
rtn.z = z;
return rtn;
}
fail: { int x = 5; goto fail; }
。更不用提 setjmp 了。 - Lundinvoid test(short i=0; loop: i++; int j=i; if (j < 10) goto loop; }
,在其生命周期内,存储的值是否发生变化?这是否意味着以某种方式访问了存储并对其进行了更改?是否使用任何类型为int
的lvalue表达式来修改j
?请注意,setjmp
允许与自动持续时间对象交互。 - supercat