我用以下方式声明了一个变量:
int i = 0;
我收到了警告:
ISO C90 禁止混合声明和代码
我该如何修复它?
我认为你应该将变量声明移到代码块顶部,即:
{
foo();
int i = 0;
bar();
}
到
{
int i = 0;
foo();
bar();
}
{foo(); {int i=0; bar();}}
(注:翻译中保留了代码语法和标点符号,以确保表达准确无误。) - alk在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或更高版本,则需要找到另一个 支持 它的编译器,或者重写代码,以使块内的所有声明都在任何语句之前。
只需使用编译器(或为其提供所需参数),使其编译更高版本的C标准,如C99或C11。例如,对于GCC编译器系列,应使用-std=c99
参数。
确保变量位于块的顶部,并且在使用-ansi-pedantic
编译时,确保它看起来像这样:
function() {
int i;
i = 0;
someCode();
}
= 0
。
如果触发了错误,则很可能是声明在代码之后。
如果没有错误,则可能与C标准强制执行/编译标志或其他相关。
无论如何,在当前范围的开头声明变量。然后可以单独初始化它。如果该变量值得拥有自己的作用域 - 请使用{}限定其定义。
如果OP能够澄清上下文,那么将会有更具针对性的回复。
-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://dev59.com/KWUq5IYBdhLWcg3wKtRL#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上进行了测试。
确保在块中的任何语句之前声明变量。
例如:
{
int i = 0;
printf("a string");/*the code is not a working code*/
}
-pedantic
或者-std=c89
,那么你可以使用-std=gnu99
进行编译,如果你愿意的话。 - Dietrich Epp-std=c99
这个参数,这样就可以使用C99标准。C99允许在代码中夹杂声明语句和其他语句。 - hmjd