我以这种方式声明了一个变量:
int i = 0;
我得到警告:
ISO C90禁止混合声明和代码
我该如何解决?
我以这种方式声明了一个变量:
int i = 0;
我得到警告:
ISO C90禁止混合声明和代码
我该如何解决?
-std=c99
)。
Answers:
我认为您应该将变量声明移动到块顶部。即
{
foo();
int i = 0;
bar();
}
至
{
int i = 0;
foo();
bar();
}
{foo(); {int i=0; bar();}}
直到C99标准,所有声明都必须出现在块中的任何语句之前:
void foo()
{
int i, j;
double k;
char *c;
// code
if (c)
{
int m, n;
// more code
}
// etc.
}
C99允许混合声明和语句(例如C ++)。许多编译仍然默认为C89,和一些编译器(如微软)不支持C99可言。
因此,您需要执行以下操作:
确定您的编译器是否支持C99或更高版本;如果是这样,请对其进行配置,以使其编译为C99而不是C89;
如果你的编译器不支持C99或更高版本,你要么需要找到一个不同的编译器不支持它,或者重写代码,使所有声明的块内的所有语句之前。
-Wdeclaration-after-statement
最小的可复制示例
main.c
#!/usr/bin/env bash
set -eux
cat << EOF > main.c
#include <stdio.h>
int main(void) {
puts("hello");
int a = 1;
printf("%d\n", a);
return 0;
}
EOF
发出警告:
gcc -std=c89 -Wdeclaration-after-statement -Werror main.c
gcc -std=c99 -Wdeclaration-after-statement -Werror main.c
gcc -std=c89 -pedantic -Werror main.c
不要发出警告:
gcc -std=c89 -pedantic -Wno-declaration-after-statement -Werror main.c
gcc -std=c89 -Wno-declaration-after-statement -Werror main.c
gcc -std=c99 -pedantic -Werror main.c
gcc -std=c89 -Wall -Wextra -Werror main.c
# https://stackoverflow.com/questions/14737104/what-is-the-default-c-mode-for-the-current-gcc-especially-on-ubuntu/53063656#53063656
gcc -pedantic -Werror main.c
警告:
main.c: In function ‘main’:
main.c:5:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
int a = 1;
^~~
已在Ubuntu 16.04,GCC 6.4.0上测试。
-pedantic
或-std=c89
,在这种情况下,您可以根据需要进行编译-std=gnu99
。