我试图在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手册。
答案 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
块项:
声明
语句