(非常)简单的 C++ 程序中从文件获取数字输入的编译器问题

问题描述 投票:0回答:5
#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;
}

这是一段非常简单的代码,用于从文件中读取一些数字。 不幸的是我无法编译它。行后/行上有错误 “常量 int FILENAME_MAX=20;” 该错误显示“在数字常量之前预期有不合格的 id。”

有人可以告诉我我做错了什么吗?


我正在 Mac OS 10.5.8 上使用 Xcode 3.0 进行编译

c++ macos file-io constants
5个回答
7
投票

FILENAME_MAX
是标准库*定义的宏,因此它已被用作标识符。当您尝试将其用作标识符时,它实际上在预处理过程中被替换为某个数字。数字不是有效的标识符,因此您会收到错误消息。 (这就是为什么它说“我期待一个标识符,而不是一个数字常量。”)

将其重命名为其他名称。 (或者使用

std::string
,尽管你似乎还没有完全做到这一点。)

*由

<cstdio>
定义。虽然您不直接包含它,但其他标准库标头可以自由地包含它们认为合适的任何其他标准标头。


3
投票

为什么把

FILENAME_MAX
全部大写?所有大写字母通常用于宏,当你点击一个(正如你所做的那样)时,预处理器会无意识地践踏你的代码,进行最愚蠢的替换。

为宏保留此类标识符,除非确实必须,否则不要使用宏(在 C++ 中很少出现这种情况),并且这种情况不会发生。


1
投票

FILENAME_MAX
可能是某处的
#define
。尝试一下
#undef FILENAME_MAX


1
投票

FILENAME_MAX 已在 stdio.h 中定义。 更改你的常量名称。


0
投票

我使用的是 Ubuntu Linux,我可以编译它。我将 FILENAME_MAX 更改为 F_M 并且成功了。

© www.soinside.com 2019 - 2024. All rights reserved.