【问题标题】:Does C11 allow variable declarations at any place in a function?C11 是否允许在函数中的任何位置声明变量?
【发布时间】:2012-10-28 17:05:50
【问题描述】:

C11 标准(注意我不是指 C++11)是否允许您在函数中的任何位置声明变量?

以下代码在 ANSI C (C89, C90) 中无效:

int main()
{
  printf("Hello world!");
  int a = 5; /* Error: all variables should be declared at the beginning of the function. */
  return 0;
}

它是 C11 中的有效源代码吗?

【问题讨论】:

  • 为什么它不是有效的 ANSI C? ANSI 是否以某种方式拒绝更新其国家标准以遵循 C99?
  • 如果您正确理解 ANSI C 的含义,则它是有效的 ANSI C。 ANSI 将那里的标准更新为最新版本。不幸的是,在城市俚语中,术语“ANSI C”错误地适用于 C 89。
  • @JensGustedt:另一种看待它的方式是,ANSI C 确实是 C89,但自 1990 年以来,标准一直是 ISO C,并且 ANSI 已经认可 ISO C 作为标准。 ISO C 90 和 ANSI C 89 之间的区别在于章节编号 AFAIK;否则,案文不变。但这是分裂的头发。 GCC 使用-ansi 作为-std=c89 的同义词并且不识别-std=c90(但大多数版本的GCC 识别std=c99,而最近的一些版本识别-std=c11)。 POSIX 过去需要c89 C 编译器;它目前需要c99 编译器,因为它还没有被修改过。

标签: c c11 variable-declaration


【解决方案1】:

是的。这在 C99 中已经有效(参见第二个项目符号 here)。

【讨论】:

    【解决方案2】:

    或多或少。 C99 引入了通过块和for 循环的第一部分声明变量的能力,C2011 继续了这一点。

    void c99_or_later(int n, int *x)
    {
        for (int i = 0; i < n; i++)  // C99 or later
        {
             printf("x[%d] = %d\n", i, x[i]);
             int t = x[i];           // C99 or later
             x[0] = x[i];
             x[i] = t;
        }
    }
    

    您可能还注意到,C++ 样式的尾部 cmets 也仅在 C99 或更高版本中有效。

    如果您必须处理不符合 C99 标准的 C 编译器(例如 MSVC),那么您就不能使用这些(方便的)符号。 GCC 为您提供了一个有用的警告标志:-Wdeclaration-after-statement

    请注意,您不能在标签后立即声明 (C11 §6.8.1 Labelled statements);您不能标记声明或跳转到声明。另见§6.8.2 Compound statement§6.7 Declarations§6.9 External definitions。但是,您可以标记一个空语句,所以这不是一个大问题:

    label: ;
        int a = 5;
    

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      • 2015-02-20
      相关资源
      最近更新 更多