ISO C90禁止在代码中混合声明和数组,怎样解决这个问题?

3

我尝试使用-gcc编译它,结果如愿以偿,但是当加上-pedantic时,它就无法编译。我在编程方面还是个初学者,这是我第一次遇到这个问题,对我来说真的是一个大问题。

这里是导致错误的代码:

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

如果您能解释解决方案而不只是提供固定代码,我会非常感激,因为我想学习。


1
发布更多上下文。你的本地块(即由{}包围的代码)是什么样子? - undefined
2
你可以使用c99 (-std=c99) - undefined
@kenneth,程序无法编译不仅仅是因为数组的问题,还包括所有类型的声明,比如intchar等。 - undefined
可能是ISO C90禁止在C中混合声明和代码的重复问题,因为顶部答案中提到它是一个数组并不重要。 - undefined
1个回答

8
这与数组无关。标准化的C语言(ISO C90)的原始版本禁止混合声明和代码。在C90中,每个被{}包围的本地块都有相当严格的结构:它以声明(如果有)开头,然后是语句(代码)。必须按照这种格式进行。将数组声明移动到块的顶部即可。这应该很简单,因为您的所有初始化器都不依赖于任何运行时计算。就是这样。
{
  /* Declarations go here */
  char *exercise[5]={"swimming", "running", "brisk walking", "weight lifting", "zumba"};

  /* Statements (i.e. code) goes here */
}

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

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


2
+1,但为什么推荐如此古老的C99标准呢?或者换句话说,为什么不推荐C11呢? - undefined
3
因为安装了几年前的Linux发行版,可能仍会提供不支持-std=c11参数的编译器。或者是因为C99和C11之间几乎没有太大的区别:后者只是使一些事情变成可选项,并引入了一个内存模型,如果您不编写并发程序,则无需关心该模型。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接