2015-09-28 4 views
3

Есть ли причина, по которой код ниже не должен работать? (Обобщение, как C Кодекса)Ошибка C99 stdint.h в VS2013

код

#include <stdint.h> 

int main() 
{ 
    int var = 10; 
    if (var == 0) return 1; 
    uint8_t data; 
    return 0; 
} 

Сообщения об ошибках

Ошибка 3 Ошибка C2065: 'данных': необъявленный идентификатор Ошибка 2 Ошибка C2146: ошибка синтаксиса: отсутствует ';' Перед Ошибкой 1 ошибка «данных» идентификатора C2275: «uint8_t»: незаконное использование данного типа, как выражение

Может быть, это ошибка в vs2013?

Чтобы исправить выше, все это может быть сделано:

  • Вернуться заявление в bracets будет это исправить, т.е. если (вар == 0) {возвращение; }
  • Delcare uint8_t данные перед если заявления
  • Используйте неподписанные символ вместо uint8_t
  • компилировать с C++ "Compile как код C++" (проект свойства-> C/C++ -> Advanced -> Compile As)

Update: vs2015 (vs140), кажется, не имеют эту «ошибку»

+0

fyi - код скомпилирован с gcc. В большинстве случаев я получаю от pedantic предупреждение: 'ISO C90 запрещает смешанные декларации и код'. это только появляется, если я указываю pedantic в дополнение к std = c89 .. – amdixon

+2

VC не является C99-компилятором. – Olaf

+0

У моего VS2013 нет никаких проблем с этим кодом, но VS2010 ему не нравится. – molbdnilo

ответ

4

Визуальный Studio C компилятор традиционно очень плохо следуя поздними стандартам, и в одно время даже говорили, что они не поддержали бы C99 (или позже) на всех IIRC. Это означает, что компилятор C поддерживает только C89, который не позволяет размещать объявления переменных в любом месте, только в начале блоков.

Так что вам нужно сделать

int var = 10; 
uint8_t data; /* Moved declaration here */ 
if (var == 0) return; 

Следует отметить, что Microsoft изменила свою позицию в отношении С и более поздними стандартов C, и что более поздние версии и обновления сделали компилятор более современен с током (или, по крайней мере, C99).

+1

Есть ли у вас ссылка на претензию, что MSVS поддерживает * по крайней мере C99 *? AFAIK, они поддерживают только выборочные возможности C99 (не все). –

+0

@BlueMoon Ну [этот пост] (http://stackoverflow.com/a/27827416/440558), похоже, отвечает на большинство вопросов о поддержке VS C99, так или иначе. Но, как я уже сказал, это очень недавняя попытка. –

+4

Следует отметить, что когда MS говорит: «Visual Studio 2015 полностью реализует C99», они на самом деле означают «вот что-то несерьезное дерьмо, где некоторые вещи отсутствуют, а другие не следуют стандарту, потому что мы не знаем и/или заботиться о стандарте C ". – Lundin

1

Соответствует ли VS2013 требованиям/требованиям C99? IIRC - нет. В C89 объявления должны появляться в начале блоков и не могут быть смешаны с кодом, как они могут на C++ или C99 и более поздних.

А вы не разрешено объявлять main как пожелаете. Это должно быть int main(void).

+0

Это правда, но MSVC поддерживает '', поэтому это не проблема. – ElderBug

+0

@ ElderBug Спасибо за информацию; Я соответствующим образом адаптировал свой ответ. – Jens

Смежные вопросы