我想知道是否有人在没有在函数顶部声明变量的情况下强制gcc使当前编译失败。
void foo() {
int bar; //Enabled
/* some code stuff */
int bar2; //Compile Error
}
我已经看到我需要使用-pedantic
&& -ansi
进行编译。
我的项目已经是这种情况,但似乎不起作用。
顺便说一句,我正在C89
中进行编译,确实需要保持该C版本。 (-ansi
)
在我所看到的所有文档中,没有gcc标志允许执行此操作。 有什么我想念的吗?
答案 0 :(得分:4)
有一个警告语句后声明或声明的变量的选项:
-Wdeclaration-after-statement
-警告,除非您还设置了-Werror
(并且始终使用-Werror
是个好主意;您将不会忘记修正警告!) -Werror=declaration-after-statement
-即使未设置-Werror
这将强制将变量定义在任何语句块的顶部(如C90所要求),而不是允许在需要时声明变量(如C99及更高版本所允许)。这不允许:
int function(int x)
{
int y = x + 2;
printf("x = %d, y = %d\n", x, y);
int z = y % x; // Disallowed by -Wdeclaration-after-statement
printf("z = %d\n", z);
return x + y + z;
}
我不知道有一个选项可以阻止您在函数的内部块的{
之后声明变量。
答案 1 :(得分:0)
-pedantic
仅针对需要标准发布的情况发布诊断。这些只是警告。假设与 -pedantic-errors
-ansi
结合使用时,-std=c90
将具有您想要的行为;)
示例:
#include <stdio.h>
int main(void) {
printf("Hello Stack Overflow\n");
int fail;
}
然后:
% gcc test.c -ansi -pedantic
test.c: In function ‘main’:
test.c:4:3: warning: ISO C90 forbids mixed declarations and code
[-Wdeclaration-after-statement]
int fail;
^~~
% ./a.out
Hello Stack Overflow
但带有-pedantic-errors
:
% gcc test.c -ansi -pedantic-errors
test.c: In function ‘main’:
test.c:4:3: error: ISO C90 forbids mixed declarations and code
[-Wdeclaration-after-statement]
int fail;
^~~
% ./a.out
bash: ./a.out: No such file or directory
版本是
% gcc --version
gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
请注意,即使ISO C90也不要求声明必须在函数的顶部-任何 compound语句的开头都将这样做。