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

问题描述 投票:0回答:2

我编写了一个编译多个文件的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 工作正常。为什么这样??

gcc makefile compiler-errors g++
2个回答
3
投票

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
定义为 nothing

编辑实际上,它可能会导致

FILE
本身的声明出现问题,而不是
fopen()
等函数:

typedef struct __sFILE {
    ...
} FILE;

其中

FILE
替换为


1
投票

定义

FILE
是一个非常糟糕的主意*,因为它已经作为标准库中的类型存在


* 又名“调用未定义的行为”。

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