2011-12-13 21 views
3

Может кто-нибудь, пожалуйста, объясните, почему этот код компилируется:Почему этот код не компилируется?

#include <stdio.h> 
#include <string.h> 

int main (int argc, char *argv []) 
{ 
    FILE *ptr; 

    char string[10] = "Testing"; 

    ptr = fopen("C:\\Users\\Jordan\\Desktop\\Hello.txt", "wb"); 

    fwrite(string,sizeof(string[0]), sizeof(string)/sizeof(string[0]), ptr); 
} 

Но это не делает: Дает C2065 Ошибка: 'строка': необъявленная идентификторов

#include <stdio.h> 
#include <string.h> 


int main (int argc, char *argv []) 
{ 
    FILE *ptr; 

    ptr = fopen("C:\\Users\\Jordan\\Desktop\\Hello.txt", "wb"); 

    char string[10] = "Testing"; 

    fwrite(string,sizeof(string[0]), sizeof(string)/sizeof(string[0]), ptr); 

} 

Я использую Visual Studio 2010 на ОС Windows 7 Машина.

Благодаря

+0

@DavidHeffernan - Да, когда я компилирую и запускаю его прежний фрагмент кода, он работает. Тем не менее, когда я пытаюсь скомпилировать нижнюю версию (где моя строка объявляется после открытия файла, она дает мне эту ошибку. Ошибка 3 ошибка C2065: 'строка': необъявленный идентификатор – Jordan

+1

Да, у других это. Nasty MS C89! Если вы хотите написать C, а не C++, тогда вы должны получить лучший компилятор. –

+1

Мне нравится, как «string» и «string.h» сбивали меня с ума (и, возможно, все остальные). – Mysticial

ответ

8

Visual Studio использует старый C89/90 C. В этой старой версии C вы не можете смешивать объявления и код.

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

// This a declaration 
FILE *ptr; 

// This is code 
ptr = fopen("C:\\Users\\Jordan\\Desktop\\Hello.txt", "wb"); 

// This is another declaration. Not Allowed in C89/C90!!! 
char string[10] = "Testing"; 
+1

И я считаю, что MS записала запись о том, что VS никогда не будет поддерживать что-либо за пределами C89. –

+0

Спасибо! Я думал, что что-то вроде этого было h appening, трудно поверить! Назад к eclipse ... – Jordan

+0

Я не думаю, что они заявили об этом явно, но они определенно подразумевали это много раз на основе их ответов на запросы поддержки C99. – Mysticial

3

В (версия C89 из) С, все переменные должны быть объявлены в верхней части блока (функции, в данном случае). В вашем первом примере вы это делаете, а во втором - нет.

+0

Только pre-C99 ... –

+0

@Oli: True - отредактирован. –

2

Если вы сохранили этот файл с расширением .c компилятор интерпретирует его как исходный C файл, и так как VC++ поддержка C для C89, C89 правила для объявления переменной применяется; в частности, в C89 вы должны объявить все локальные переменные в начале своего блока.

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