Проблема компилятора в (очень) простой программе на C ++, которая получает числовой ввод из файла - PullRequest
2 голосов
/ 24 июля 2010
#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

const int FILENAME_MAX=20;

int main() {

    ifstream input;
    char name[FILENAME_MAX + 1];
    int value;

    do {

        cout << "Enter the filename (maximum of " << (FILENAME_MAX+1) 
        << " characters: ";
        cin >> name;
        input.open(name);

    } while(input.fail() );

    while(input >> value) {
    int count=1;

    cout << "value #" << count << "\t" << value << endl;

    count++;
    }

return 0;
}

Это очень простой кусок кода для чтения некоторых чисел из файла. К сожалению, я не могу заставить его скомпилировать. Есть ошибка после / на линии "const int FILENAME_MAX = 20;" В сообщении об ошибке указано «ожидаемый неквалифицированный идентификатор перед числовой постоянной».

Может кто-нибудь сказать мне, что я делаю не так?


Я компилирую в Mac OS 10.5.8 с Xcode 3.0

Ответы [ 5 ]

6 голосов
/ 24 июля 2010

FILENAME_MAX - это макрос, который определяется стандартной библиотекой * и поэтому уже используется для использования в качестве идентификатора. Когда вы пытаетесь использовать его в качестве идентификатора, он на самом деле заменяется во время предварительной обработки на некоторое число. Номер не является допустимым идентификатором, поэтому вы получаете ошибку. (Вот почему он говорит: «Я ожидал идентификатор, а не числовую константу».)

Переименуйте его в другое. (Или используйте std::string, хотя кажется, что вы еще не совсем там.)

* Он определяется <cstdio>. Хотя вы не включаете его напрямую, другие стандартные библиотечные заголовки могут включать любые другие стандартные заголовки по своему усмотрению.

3 голосов
/ 24 июля 2010

Почему вы делаете FILENAME_MAX все прописными буквами ? Весь верхний регистр обычно используется для макросов, и когда вы нажмете один (как и вы), препроцессор бездумно растопчет ваш код, делая самые глупые замены.

Зарезервируйте такие идентификаторы для макросов, не используйте макросы, если это действительно необходимо (что редко бывает в C ++), и этого не произойдет.

1 голос
/ 24 июля 2010

FILENAME_MAX уже определен в stdio.h. Измените свое имя const.

1 голос
/ 24 июля 2010

FILENAME_MAX, вероятно, где-то #define. Попробуйте #undef FILENAME_MAX.

0 голосов
/ 24 июля 2010

Я на Ubuntu Linux, и я мог бы скомпилировать его.Я изменил FILENAME_MAX на F_M, и это сработало.

...