由于数组,ISO C90禁止混合声明和代码.我该如何解决?

ken*_*eth 1 c arrays compiler-errors gcc-pedantic

我尝试使用-gcc它编译它,它按预期工作,但添加时-pedantic,它将无法编译.我还是编程的初学者,这是我第一次遇到这个问题所以对我来说这是一个很大的问题.

以下是导致错误的代码:

char *exercise[5]={"swimming", "running", "brisk walking", "weight lifting", "zumba"};
Run Code Online (Sandbox Code Playgroud)

如果您能解释解决方案的内容而不仅仅是固定代码,我会很感激,因为我想学习.

AnT*_*AnT 6

这与数组没有任何关系.标准化C语言的原始版本(ISO C90)禁止混合声明和代码.

在C90中,每个被包围的局部块{}都具有相当严格的结构:它以声明(如果有的话)开头,然后是语句(代码).

这是你必须遵循的格式.将数组声明移动到块的顶部.它应该是微不足道的,因为你的初始化器都不依赖于任何运行时计算.这里的所有都是它的.

{
  /* Declarations go here */
  char *exercise[5]={"swimming", "running", "brisk walking", "weight lifting", "zumba"};

  /* Statements (i.e. code) goes here */
}
Run Code Online (Sandbox Code Playgroud)

当然,这里的一个未说出口的问题是:你真的必须使用C90吗?您是否明确要求为C90编译器编写代码?也许您应该简单地将编译器切换到C99模式并忘记这个特定于C90的限制?

在较新版本的C语言(C99及更高版本)中,您可以自由地混合语句和声明.通过-std=c99在命令行中指定,可以将GCC切换到C99模式.

  • @JonathanLeffler因为几年前安装的Linux发行版仍然可能提供不支持-std = c11的编译器.或者因为C99和C11之间的差异非常小:后者使一些东西成为可选的,并引入一个内存模型,如果不编写并发程序,则无需关心. (3认同)
  • +1,但为什么推荐像C99这样的旧标准 - 或者为什么不推荐C11,换句话说? (2认同)