我以这种方式声明了一个变量:
int i = 0;
我收到警告:
ISO C90 禁止混合声明和代码
我该如何解决?
我认为您应该将变量声明移到块的顶部。IE
{
foo();
int i = 0;
bar();
}
到
{
int i = 0;
foo();
bar();
}
在 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
最小可重现示例
主程序
#!/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 上测试。