使用 -D 选项时 gcc 编译器错误

标签 gcc compiler-construction compiler-errors g++

我编写了一个编译多个文件的 makefile。当执行这样的行时:

g++ -c -Wall -U DEBUG -U FILE -U HighPriority -U OnlyCUDA -U CUDA -U THREAD_NUM -U SIZE -U InputFileName -D FILE -D SIZE=32 -D THREAD_NUM=4 -D CUDA -D InputFileName=input/In32.txt  ../src/lib/Globals.cpp -o Globals.o

它会生成大量错误列表:

In file included from /usr/include/wchar.h:36:0,
                 from /usr/include/c++/4.6/cwchar:46,
                 from /usr/include/c++/4.6/bits/postypes.h:42,
                 from /usr/include/c++/4.6/iosfwd:42,
                 from /usr/include/c++/4.6/ios:39,
                 from /usr/include/c++/4.6/istream:40,
                 from /usr/include/c++/4.6/sstream:39,
                 from /usr/include/c++/4.6/complex:47,
                 from ../src/lib/../inlcude/Globals.h:3,
                 from ../src/lib/Globals.cpp:1:
/usr/include/stdio.h:48:25: error: expected unqualified-id before numeric constant

但是当我删除 -D FILE 时它编译得很好。这是关于什么的??

编辑1: 例如,当我使用代码块时,相同的 #define FILE 工作正常。为什么这样??

最佳答案

FILE 已在 C 中用作文件指针对象(请参阅 fopen(3) 联机帮助页)。

您需要为该常量选择一个不同的名称。

实际的错误是由诸如fopen()这样的函数声明引起的:

FILE *fopen(const char *restrict filename, const char *restrict mode);

变成:

*fopen(const char *restrict filename, const char *restrict mode);

因为您将FILE定义为什么都没有

编辑实际上,它可能会导致 FILE 本身的声明出现问题,而不是 fopen() 等函数:

typedef struct __sFILE {
    ...
} FILE;

其中 FILE 被替换为什么都没有

关于使用 -D 选项时 gcc 编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16983095/

相关文章:

c - 在哪里更改 LD_LIBRARY_PATH

c++ - 如何使用 gcc/g++ 在 Linux 上为 Windows 编译?

c - 如何知道我的项目在构建代码时使用哪个头文件

c - 标准 C 库和系统调用如何协同工作?

C 结构示例,编译期间出错

c++ - ld : library not found for -lgcc_ext. 10.5

java - 枚举:每个实例独有的方法

java - 从编译器中提取源代码元数据

c++ - “double& Point::operator[](unsigned int)”在此上下文中不可访问

ruby - 在没有Xcode命令行工具的情况下安装Ruby时出错: No such file, but it exists