代码:
char* to_return = NULL;;
char* final_encoding = NULL;
无法编译。
错误:error C2143: syntax error : missing ';' before 'type'
相同的行为:
int something = 0;;
(我只是想确保NULL宏没有弄乱)
代码:
char* to_return = NULL;
char* final_encoding = NULL;
成功。
使用Visual Studio 2012编译为C而不是C ++。为什么???
编辑:
以下代码触发了这种错误行为:
void test_fun()
{
;
int a = 0;
if(a == 1)
{
return;
}
}
答案 0 :(得分:4)
不要相信我的话,但可能是因为在代码块中的变量声明之前有一个语句;语句为;
,空语句和变量char* final_encoding
。
我的Microsoft Visual Studio 2013不会抱怨,据我所知VS 2012不像VS 2013那样支持C99
甚至不支持,尽管2013年也没有也完全遵守。
答案 1 :(得分:0)
char* to_return = NULL;;
char* final_encoding = NULL;
这是否合法取决于它出现的位置(在函数定义内部或外部)以及编译器支持的语言版本。
单独的分号是 null语句。我认为没有必要使用null语句,但它可以提高清晰度,如:
while (*foo++ = *bar++)
;
如果上述声明出现在文件范围内,在任何函数定义之外,那么额外的分号就是语法错误;没有空声明这样的东西,并且在文件范围内不允许声明。
如果它们出现在块范围内,介于函数定义的{
和}
之间,那么它们是有效的,如果您的编译器支持C99或更高版本。如果你的编译器只支持C90(我相信微软的编译器会这样做),那就是语法错误。 (C ++总是允许混合声明和语句。)
另一方面,某些编译器可能允许在块范围内使用分散分号作为语言扩展。 gcc默认是这样做的;使用-pedantic
选项,它会发出警告。
在C99中,你有一个声明,后跟一个空语句,然后是另一个声明,这在块范围内完全合法。
在C90中,声明可能不会遵循同一范围内的语句,因此再次出现语法错误。
无论如何,解决方案很简单:删除额外的分号。