使用MSVS2012和两个&#34 ;;;" s编译C代码

时间:2014-03-19 20:29:22

标签: c visual-studio-2012 compiler-errors

代码:

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;
    }
}

2 个答案:

答案 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中,声明可能不会遵循同一范围内的语句,因此再次出现语法错误。

无论如何,解决方案很简单:删除额外的分号。