【发布时间】:2020-05-21 05:29:07
【问题描述】:
假设我有一个来自 gcc -D 选项的定义,例如
gcc -DBINDIR=\"/usr/bin\"
我想要的是为这个现有定义添加一个路径,因此 BINDIR 类似于 "/home/user/testbuild/usr/bin"
我尝试了什么:
#define STRINGIZE_NX(A) #A
#define STRINGIZE(A) STRINGIZE_NX(A)
#define PRE_PATH "/home/user/testbuild"
#pragma message "PRE_PATH: " STRINGIZE(PRE_PATH)
#ifndef BINDIR
# error "BINDIR must be defined"
#else
# pragma message "BINDIR: " STRINGIZE(BINDIR)
# define TMP BINDIR
# pragma message "TMP: " STRINGIZE(TMP)
# undef BINDIR
# define BINDIR PRE_PATH TMP
# pragma message "BINDIR: " STRINGIZE(BINDIR)
# undef TMP
#endif
在查看编译器输出时,在我看来,TMP 没有按我预期的方式分配给 BINDIR 的值:
note: #pragma message: PRE_PATH: "/home/user/testbuild"
note: #pragma message: BINDIR: "/usr/bin"
note: #pragma message: TMP: BINDIR
note: #pragma message: "/home/user/testbuild" BINDIR
最后编译器会在定义应该连接的地方失败:
error: expected ')' before 'TMP'
# define BINDIR PRE_PATH TMP
我做错了什么?
感谢您的每一个帮助!
【问题讨论】:
-
不可能。
-
哪一部分不行?我试过this and the output seems ok.。
-
它部分回答了它,但我不明白为什么我不能将定义的值存储在另一个定义中。一旦我#undef 源,它也会在新定义中丢失 - 即使我之后取消定义它。所以我无法存储值而不是对原始 makro 进行某种引用? @Groo 好吧,如果使用新定义它可以工作,但我的意图是重用 BINDIR
-
哦,您想更改
BINDIR宏本身吗?你确定这是真的需要吗?也许您可以分享一些细节,以确保我们没有在寻找 XY 问题。 -
Excatly - 真正的目的是在不交叉编译时调整一些目标路径。我确信实现这一目标的正确方法是正确更改构建环境,但在我的情况下,这需要重新处理一个非常大的项目的一堆 Makefile,所以我想到了一个替代方案
标签: c++ c c-preprocessor