Синтаксическая ошибка MSVC с оператором if и объявлением переменной

Я не могу понять это. Обычный C, скомпилированный с помощью компилятора MSVC в командной строке.

Microsoft (R) 32-разрядный оптимизирующий компилятор C/C++ версии 15.00.30729.01 для 80x86
Copyright (C) Microsoft Corporation. Все права защищены.

С блоком if (NULL == string) { return NULL; } я получаю синтаксическую ошибку.

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

person Niklas R    schedule 18.08.2014    source источник
comment
Переместить int index; в начало блока? (Старый C может не разрешать объявления переменных, кроме начала блока.   -  person chux - Reinstate Monica    schedule 18.08.2014
comment
@chux Да, вот и все. На самом деле не думал об этом. Это компилятор Win7 SDK (кажется, v110?).   -  person Niklas R    schedule 18.08.2014
comment
@н.м. Теперь, когда мы знаем, в чем проблема, да :) Спасибо за ссылку, кстати.   -  person Niklas R    schedule 18.08.2014
comment
Кстати: код всегда может создать новый уровень блока, добавив {} вокруг { int index; for (index = 0; index < buffer->count; ++index) { int value = *drift_char buffer_get(buffer, index); if (value > 127) value = '?'; string[index] = value; } string[index] = 0;}   -  person chux - Reinstate Monica    schedule 18.08.2014
comment
используйте компилятор VS2013 или C99.   -  person BLUEPIXY    schedule 19.08.2014


Ответы (1)


Что ж, ваш «простой C» на самом деле C99 или пост-C99 C. Между тем, компилятор MSVC поддерживает только «классический старый добрый простой C», также известный как C89/90. В классическом C запрещено смешивать операторы и объявления. Все объявления должны быть сделаны в самом верху блока.

person AnT    schedule 18.08.2014