我用这种方式声明了一个变量:
int i = 0;
我收到警告:
ISO C90禁止混合声明和代码
我该如何解决?
答案 0 :(得分:96)
我认为你应该将变量声明移到块的顶部。即。
{
foo();
int i = 0;
bar();
}
到
{
int i = 0;
foo();
bar();
}
答案 1 :(得分:26)
直到C99标准,所有声明都必须在块中的任何语句之前出现:
void foo()
{
int i, j;
double k;
char *c;
// code
if (c)
{
int m, n;
// more code
}
// etc.
}
C99允许混合声明和语句(如C ++)。许多编译器仍默认使用C89,而某些编译器(如Microsoft)根本不支持C99 。
因此,您需要执行以下操作:
确定您的编译器是否支持C99或更高版本;如果是这样,配置它以便它编译C99而不是C89;
如果您的编译器不支持C99或更高版本,您将需要找到 支持它的其他编译器,或者重写代码以便所有声明都在任何语句之前在街区内。
答案 2 :(得分:10)
只需使用编译器(或为其提供所需的参数),以便编译更新版本的C标准,C99或C11。例如,GCC系列编译器将为-std=c99
。
答案 3 :(得分:3)
确保变量位于块的顶部,如果使用-ansi-pedantic
进行编译,请确保它看起来像这样:
function() {
int i;
i = 0;
someCode();
}
答案 4 :(得分:2)
要诊断真正触发错误的内容,我会首先尝试删除= 0
如果错误被触发,那么很可能是声明在代码之后。
如果没有错误,那么它可能与C标准强制执行/编译标志或其他内容有关。
在任何情况下,都要在当前范围的开头声明变量。然后,您可以单独初始化它。实际上,如果这个变量值得拥有自己的范围 - 在{}中划定它的定义。
如果OP可以澄清背景,那么将会有更直接的反应。
答案 5 :(得分:0)
-Wdeclaration-after-statement
最小可重复示例
#!/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
# Give warning.
! 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
# Don't give warning.
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上进行了测试。