在范围的开头声明C89局部变量?

时间:2012-03-01 09:26:40

标签: c visual-studio-2010 variables declaration

我试图在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手册。

3 个答案:

答案 0 :(得分:3)

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

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

MSVC对C的支持相当差,我担心。它只支持带有一些扩展名的C89(旧!)。

答案 1 :(得分:3)

ANSI C89要求在范围的开头声明变量。这在C99中放松了。

当您使用gcc标志时,-pedantic很明显,这会更严格地执行标准规则(因为它默认为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 :(得分:2)

  

现在我在许多地方读到你必须在变量存在的代码块的开头声明变量。这通常适用于ANSI C 89吗?

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

  

(C90,6.6.2复合声明或块)

     

<强>语法

     

化合物语句

     

{declaration-list_opt statement-list_opt}

声明必须是之前的语句

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

  

(C99,6.8.2复合声明)

     

<强>语法

     

化合物语句

     

{block-item-list_opt}

     

块项目列表:

     

块项

     

block-item-list block-item

     

块项:

     

声明

     

语句