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

我试图在ANSI C中这样做:

include  int main() { printf("%d", 22); int j = 0; return 0; } 

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

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

这确实有效:

 include  int main() { int j = 0; printf("%d", 22); return 0; } 

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

我找到了许多人们提出这个建议的论坛,但我没有看到它写在任何“官方”来源,如GNU C手册。

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

当您使用-pedantic标志时,这很明显,它会更紧密地强制执行标准规则(因为它默认为C89模式)。

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

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

但是使用大括号来表示范围(以及因此范围内变量的生命周期)似乎并不特别受欢迎,因此C99 ……等等。

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

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

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

现在我在许多地方读到你必须在变量存在的代码块的开头声明变量。这通常适用于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

块项目:

宣言

声明