带有if语句和变量声明的MSVC语法错误

带有if语句和变量声明的MSVC语法错误,c,visual-c++,syntax-error,cl,C,Visual C++,Syntax Error,Cl,我搞不懂这个。在命令行上使用MSVC编译器编译的纯C 针对80x86的Microsoft(R)32位C/C++优化编译器版本15.00.30729.01 版权所有(C)微软公司。版权所有 使用if(NULL==string){returnnull;}块,我得到一个语法错误 ..\src\drift_charbuffer.c(78) : error C2143: syntax error : missing ';' before 'type' ..\src\drift_charbuffer.c(7

我搞不懂这个。在命令行上使用MSVC编译器编译的纯C

针对80x86的Microsoft(R)32位C/C++优化编译器版本15.00.30729.01
版权所有(C)微软公司。版权所有

使用
if(NULL==string){returnnull;}
块,我得到一个语法错误

..\src\drift_charbuffer.c(78) : error C2143: syntax error : missing ';' before 'type'
..\src\drift_charbuffer.c(79) : error C2065: 'index' : undeclared identifier
..\src\drift_charbuffer.c(79) : error C2065: 'index' : undeclared identifier
..\src\drift_charbuffer.c(79) : error C2065: 'index' : undeclared identifier
..\src\drift_charbuffer.c(81) : error C2065: 'index' : undeclared identifier
..\src\drift_charbuffer.c(85) : error C2065: 'index' : undeclared identifier
..\src\drift_charbuffer.c(87) : error C2065: 'index' : undeclared identifier    
但是它在没有if块的情况下编译得很好。我只是看不出这里出了什么问题

char*
drift_charbuffer_tostring(const drift_charbuffer* buffer)
{
    // todo: UTF-8 encoding for characters outside the ASCII-range.
    char* string = drift_alloc(buffer->count + 1);
    if (NULL == string)
    {
        return NULL;
    }

    int index;     // Line: 78
    for (index = 0; index < buffer->count; ++index)
    {
        int value = *drift_charbuffer_get(buffer, index);
        if (value > 127)
            value = '?';

        string[index] = value;
    }
    string[index] = 0;
    return string;
}
char*
漂移\u charbuffer\u tostring(常数漂移\u charbuffer*buffer)
{
//todo:ASCII范围以外字符的UTF-8编码。
char*string=drift\u alloc(缓冲区->计数+1);
if(NULL==字符串)
{
返回NULL;
}
int index;//行:78
对于(索引=0;索引count;++index)
{
int值=*漂移\u字符缓冲\u获取(缓冲区,索引);
如果(值>127)
值='?';
字符串[索引]=值;
}
字符串[索引]=0;
返回字符串;
}

好吧,您的“普通C”实际上是C99或后C99 C。同时,MSVC编译器只支持“经典好的旧普通C”即C89/90。在经典C语言中,混合使用语句和声明是非法的。所有声明都必须在块的最顶端完成。

Move
int index到块的顶部?(旧C可能不允许除块开头之外的变量声明。@chux Ay,就是这样。真的没有想到这一点。这是Win7 SDK编译器(我想是v110?。@n.m.现在我们知道了问题所在,是的:)感谢链接btwBTW:代码总是可以通过在{int index;周围添加{}来创建新的块级别(index=0;indexcount;++index){int value=*drift\u char buffer\u get(buffer,index);if(value>127)value='?';string[index]=value;}string[index]=0;}
使用VS2013或C99编译器。