Почему этот код не компилируется? - PullRequest
3 голосов
/ 14 декабря 2011

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

#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: 'string': необъявленный идентификатор

#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);

}

Я использую VisualStudio 2010 на компьютере под управлением Windows 7.

Спасибо

Ответы [ 3 ]

8 голосов
/ 14 декабря 2011

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";
3 голосов
/ 14 декабря 2011

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

2 голосов
/ 14 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...