ISO C90禁止在C中使用混合声明和代码

时间:2012-11-08 14:51:26

标签: c variables

我用这种方式声明了一个变量:

int i = 0;

我收到警告:

  

ISO C90禁止混合声明和代码

我该如何解决?

6 个答案:

答案 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

因此,您需要执行以下操作:

  1. 确定您的编译器是否支持C99或更高版本;如果是这样,配置它以便它编译C99而不是C89;

  2. 如果您的编译器不支持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上进行了测试。