c++之C 预处理器之现有定义的前置路径

wayfarer 阅读:21 2025-02-15 21:57:57 评论:0

这个问题在这里已经有了答案:





Can I append to a preprocessor macro?

(3 个回答)


去年关闭。




假设我有一个来自 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 

我究竟做错了什么?

感谢您的每一个帮助!

请您参考如下方法:

我知道这不是你所要求的。但是,与其执行晦涩难懂的预处理器魔术,不如将其放入头文件中,例如:

#undef BIN_DIR 
#define BIN_DIR bin_dir 
extern char *bin_dir; 

和代码文件之一,并在包含上述标题之前:
char *bin_dir = PRE_PATH BIN_DIR; 


标签:C++
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号