2013-03-29 3 views
19

Я новичок в программировании C .. скажите, пожалуйста, что не так с этой программой, и почему я получаю эту ошибку: ошибка C2143: синтаксическая ошибка: отсутствует ';' перед тем 'типа' ....ошибка C2143: синтаксическая ошибка: отсутствует ';' до 'type'

extern void func(); 

int main(int argc, char ** argv){ 
    func(); 
    int i=1; 
    for(;i<=5; i++) { 
     register int number = 7; 
     printf("number is %d\n", number++); 
    } 
    getch(); 
} 
+1

Я не использовал визуальный, по крайней мере, 8 лет, но ограниченная поддержка визуала C компилятор позволяет смешанный код и переменные? Является ли строка ошибки для объявления для int i = 1; ?? Попробуйте переместить его над вызовом функции func(); Кроме того, я бы использовал extern void func (void); –

+0

Вы не показываете полный код. Обрезанный вопрос является точным и не должен приводить к синтаксическим ошибкам. – Ionic

+1

@ RandyHoward: Я считаю, что это проблема: Visual C не позволяет смешивать объявления и утверждения, добавленную к C по стандарту ISO 1999 года, который Visual Studio не поддерживает. Вы должны опубликовать это как ответ. –

ответ

26

Я не использовал визуальное изображение не менее 8 лет, но, похоже, ограниченная поддержка компилятора C в Visual не допускает смешанного кода и переменных. Является ли строка ошибки в декларации для int i=1; ?? Попробуйте переместить его выше вызова func();

Кроме того, я хотел бы использовать extern void func(void);

1

это:

int i=1; 
for(;i<=5; i++) { 

должна быть записана в виде идиоматически:

for(int i=1; i<=5; i++) { 

, потому что нет смысла объявлять for переменную цикла в функции объем.

+0

@ EdS. таким образом, переменная объявляется в блоке 'for', и это должно исправить его проблему. – lenik

+2

Этот синтаксис действителен только в C++ и C99, а не в C89. Visual Studio поддерживает только диалоги C89 C. –

+0

@AdamRosenfield. Я использовал этот синтаксис в VS2003, с тех пор не должен сильно меняться. – lenik

28

Visual Studio поддерживает только C89. Это означает, что все ваши переменные должны быть объявлены раньше всего в верхней части функции.

EDIT: @KeithThompson подтолкнул меня добавить более технически точное описание (и действительно просто исправить, где мое не в одном отношении). Все объявления (переменных или чего-либо еще) должны предшествовать всем операторам внутри блока.

+2

На самом деле это означает, что все объявления (переменных или чего-либо еще) должны предшествовать всем операторам * в блоке *. –

+1

@ KeithThompson: Определенно более технически правильный ответ. –

+0

Лучший вид правильного! 8-)} –

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