【问题标题】:Declare C89 local variables in the beginning of the scope?在作用域的开头声明 C89 局部变量?
【发布时间】:2012-03-19 19:03:08
【问题描述】:

我试图在 ANSI C 中这样做:

include <stdio.h>
int main()
{
    printf("%d", 22);
    int j = 0;
    return 0;
}

这在 Microsoft Visual C++ 2010 中不起作用(在 ANSI C 项目中)。你得到一个错误:

error C2143: syntax error : missing ';' before 'type'

这确实有效:

include <stdio.h>
int main()
{
    int j = 0;
    printf("%d", 22);
    return 0;
}

现在我在很多地方读到,您必须在代码块的开头声明变量,这些变量存在于其中。这对于 ANSI C89 通常是正确的吗?

我发现很多论坛都有人提供此建议,但我没有看到它写在任何“官方”来源中,例如 GNU C 手册。

【问题讨论】:

    标签: c visual-studio-2010 variables declaration


    【解决方案1】:

    ANSI C89 要求在作用域的开头声明变量。这在 C99 中得到了放松。

    当您使用 -pedantic 标志时,gcc 很清楚这一点,它更紧密地执行标准规则(因为它默认为 C89 模式)。

    请注意,这是有效的 C89 代码:

    include <stdio.h>
    int main()
    {
        int i = 22;
        printf("%d\n", i);
        {
            int j = 42;
            printf("%d\n", j);
        }
        return 0;
    }
    

    但是使用大括号来表示一个范围(以及该范围内变量的生命周期)似乎并不是特别流行,因此 C99 ... 等等。

    【讨论】:

      【解决方案2】:

      现在我在很多地方读到,您必须在代码块的开头声明变量,这些变量存在于其中。这对于 ANSI C 89 是否普遍正确?

      是的,这在 C89/C90 标准中复合语句的语法中是必需的:

      (C90,6.6.2 复合语句或块)

      语法

      复合语句

      { 声明-list_opt 声明-list_opt }

      声明必须在块中的之前语句。

      C99 通过允许在块中混合声明和语句来放松这一点。在 C99 标准中:

      (C99,6.8.2 复合语句)

      语法

      复合语句

      { block-item-list_opt }

      块项目列表:

      方块物品

      块项目列表块项目

      方块物品:

      声明

      声明

      【讨论】:

        【解决方案3】:

        这对于 C89 来说绝对正确。 (您最好查看该语言的文档,例如书籍和标准。编译器文档通常只记录编译器支持的语言与 ANSI C 之间的差异。)

        但是,许多“C89”编译器允许您将变量声明放在块中几乎任何位置,除非编译器处于严格模式。这包括 GCC,可以使用-pedantic 将其置于严格模式。 Clang 默认为 C99 目标,因此-pedantic 不会影响您是否可以将变量声明与代码混合使用。

        恐怕MSVC 对C 的支持很差。它仅支持带有一些扩展的 C89(旧!)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多