C 预处理器 - 为现有定义添加路径
C preprocessor - Prepending path for existing define
假设我有一个来自 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
我做错了什么?
感谢您的帮助!
我知道这不是您想要的。但是,与其使用晦涩的预处理器魔术,不如将类似 header 的文件放入:
#undef BIN_DIR
#define BIN_DIR bin_dir
extern char *bin_dir;
和代码文件之一,然后在包含上述内容之前 header:
char *bin_dir = PRE_PATH BIN_DIR;
不可能在不丢失其初始值的情况下修改宏的值。您必须记住,定义宏不等同于分配给变量。在后一种情况下,计算右边的表达式,并分配结果值。在前一种情况下,您为一系列标记定义一个名称(宏),这些标记在扩展宏之前不会被评估。所以当你定义这个时:
#define TMP BINDIR
TMP
宏不 "contain" 路径“/usr/bin”,它包含 "BINDIR",字面意思。当 TMP
扩展时,它扩展为 BINDIR
,后者又扩展为“/usr/bin”。当您取消定义 BINDIR
时,它的值将丢失并且 TMP
扩展将导致 "BINDIR".
您可以对完整路径使用不同的宏而不是 BINDIR
。像这样:
#define FULL_BINDIR PRE_PATH BINDIR
假设我有一个来自 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
我做错了什么?
感谢您的帮助!
我知道这不是您想要的。但是,与其使用晦涩的预处理器魔术,不如将类似 header 的文件放入:
#undef BIN_DIR
#define BIN_DIR bin_dir
extern char *bin_dir;
和代码文件之一,然后在包含上述内容之前 header:
char *bin_dir = PRE_PATH BIN_DIR;
不可能在不丢失其初始值的情况下修改宏的值。您必须记住,定义宏不等同于分配给变量。在后一种情况下,计算右边的表达式,并分配结果值。在前一种情况下,您为一系列标记定义一个名称(宏),这些标记在扩展宏之前不会被评估。所以当你定义这个时:
#define TMP BINDIR
TMP
宏不 "contain" 路径“/usr/bin”,它包含 "BINDIR",字面意思。当 TMP
扩展时,它扩展为 BINDIR
,后者又扩展为“/usr/bin”。当您取消定义 BINDIR
时,它的值将丢失并且 TMP
扩展将导致 "BINDIR".
您可以对完整路径使用不同的宏而不是 BINDIR
。像这样:
#define FULL_BINDIR PRE_PATH BINDIR