在 C++ CodeBlocks 项目中,我在项目设置、编译器设置、#define 中添加了以下定义:

_调试
DATA_DIR=\"/media/Shared/SiX/Data\"

这会产生以下 g++ 命令行:

g++ -Wall -g -fPIC -save-temps -D_DEBUG -DDATA_DIR=\"/media/Shared/SiX/Data\"-I../Includes -c/media/Shared/SiX/SiXConfiguration/PathManager.cpp -o对象/调试/PathManager.o

此代码无法编译:

char* commonDataDir;
#ifdef DATA_DIR
commonDataDir = DATA_DIR;
#万一

查看预处理器输出文件,我看到源代码行以这种方式展开:

commonDataDir =/media/Shared/SiX/Data;

我预计:

commonDataDir = "/media/Shared/SiX/Data";

从 Eclipse CDT 正确编译相同的代码:

g++ -D_DEBUG -DDATA_DIR=\"/media/Shared/SiX/Data\"-I"/media/Shared/SiX (copy)/Includes"-O3 -Wall -c -fmessage-length=0 -fPIC -ggdb - MMD -MP -MF"PathManager.d"-MT"PathManager.d"-o"PathManager.o""../PathManager.cpp"

因此,相同的命令行参数由 g++ 处理器以不同方式处理。我怎样才能解决这个问题?

最佳答案

在宏上加引号很棘手,也不是一个好主意。
尝试使用预处理器添加所需的引号。

#define DO_QUOTE(X)       #X
#define QUOTE(X)          DO_QUOTE(X)

#ifndef DATA_DIR
#define DATA_DIR       /tmp
#endif

char commonDataDir[] = QUOTE(DATA_DIR);

关于c++ - -D 选项从 g++ 命令行错误地扩展,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3959398/

10-12 16:07