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

69 c variables

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

int i = 0;
Run Code Online (Sandbox Code Playgroud)

我收到警告:

ISO C90禁止混合声明和代码

我该如何解决?

Joh*_*ski 106

我认为你应该将变量声明移到块的顶部.即

{
    foo();
    int i = 0;
    bar();
}
Run Code Online (Sandbox Code Playgroud)

{
    int i = 0;
    foo();
    bar();
}
Run Code Online (Sandbox Code Playgroud)

  • ......或者打开一个新的背景:`{foo(); {int i = 0; 栏();}}` (5认同)
  • @alk s/context/block这就是C标准中所称的内容. (3认同)
  • @ocean800 C90 规范说在同一块中的非声明之后不能有声明。 (2认同)

Joh*_*ode 33

直到C99标准,所有声明都必须在块中的任何语句之前:

void foo()
{
  int i, j;
  double k;
  char *c;

  // code

  if (c)
  {
    int m, n;

    // more code
  }
  // etc.
}
Run Code Online (Sandbox Code Playgroud)

C99允许混合声明和语句(如C++).许多编译仍然默认为C89,和一些编译器(如微软)不支持C99 可言.

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

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

  2. 如果你的编译器不支持C99或更高版本,你要么需要找到一个不同的编译器支持它,或者重写代码,使所有声明的块内的所有语句之前.


Jen*_*edt 11

只需使用编译器(或为其提供所需的参数),以便编译更新版本的C标准,C99或C11.例如,对于GCC系列的编译器来说-std=c99.

  • 这个答案充其量是不完整的.它确实解决了问题,但没有解释是什么导致了它.这个答案排除了无法使用更新的编译器(几种可能的原因......)或构建环境的情况,在这种环境中,无法对编译器进行切换选项.投票率下降,因为我不能同意这是"真正的"答案. (6认同)

小智 6

确保变量位于块的顶部,如果您使用 编译它-ansi-pedantic,请确保它看起来像这样:

function() {
    int i;
    i = 0;

    someCode();
}
Run Code Online (Sandbox Code Playgroud)