93

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

int i = 0;

我收到警告:

ISO C90 禁止混合声明和代码

我该如何解决?

4

6 回答 6

146

我认为您应该将变量声明移到块的顶部。IE

{
    foo();
    int i = 0;
    bar();
}

{
    int i = 0;
    foo();
    bar();
}
于 2012-11-08T14:53:40.873 回答
41

在 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 或更高版本,您将需要找到支持它的其他编译器或者重写您的代码,以便所有声明都位于块中的任何语句之前。

于 2012-11-08T16:22:06.387 回答
11

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

于 2012-11-08T15:46:03.050 回答
5

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

function() {
    int i;
    i = 0;

    someCode();
}
于 2013-05-09T09:05:17.667 回答
2

要诊断真正触发错误的原因,我会首先尝试删除= 0

  • 如果错误被触发,那么很可能声明在代码之后。

  • 如果没有错误,那么它可能与 C 标准执行/编译标志或 ...其他东西有关。

在任何情况下,都要在当前作用域的开头声明变量。然后您可以单独初始化它。事实上,如果这个变量值得拥有自己的范围 - 在 {} 中划定它的定义。

如果 OP 可以澄清上下文,那么就会有更直接的回应。

于 2012-11-08T23:48:15.180 回答
1

-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 上测试。

于 2018-10-30T12:16:29.467 回答