Ody*_*eus 7 c c++ c-preprocessor
假设我有一个来自 gcc -D 选项的定义,例如
gcc -DBINDIR=\"/usr/bin\"
Run Code Online (Sandbox Code Playgroud)
我想要的是在此现有定义之前添加路径,因此 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
Run Code Online (Sandbox Code Playgroud)
在查看编译器输出时,在我看来,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
Run Code Online (Sandbox Code Playgroud)
最后编译器将在定义应该被连接的地方失败:
error: expected ')' before 'TMP'
# define BINDIR PRE_PATH TMP
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
感谢您的每一个帮助!
在不丢失其初始值的情况下修改宏的值是不可能的。您必须记住,定义宏并不等同于分配给变量。在后一种情况下,将对右侧表达式进行求值,并分配结果值。在前一种情况下,您为一系列标记定义一个名称(宏),在扩展宏之前不会对这些标记进行求值。所以当你定义这个时:
#define TMP BINDIR
Run Code Online (Sandbox Code Playgroud)
该TMP宏不“包含”路径“/usr/bin”,它包含字面上的“BINDIR”。展开时TMP,它会展开为BINDIR,进而展开为“/usr/bin”。当您取消定义时BINDIR,它所具有的值将丢失,并且TMP扩展将仅导致“BINDIR”。
您可以做的是对完整路径使用不同的宏而不是BINDIR. 像这样的东西:
#define FULL_BINDIR PRE_PATH BINDIR
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |