如何实现C预处理器字符串宏不展开字符串内的内容?
解决Linux下编译宏替换导致路径异常的问题
现有代码prog.c如下:
#include <stdio.h> #define STR(x) _STR(x) #define _STR(x) #x int main() { const char *s = STR(MYPATH); puts(s); }
使用cc -DMYPATH=/usr/linux/path prog.c编译后,输出结果为/usr/1/path——这是因为Linux系统的编译器内置了linux宏,默认会将其展开为1,预处理器处理时会把路径中的linux替换成1,最终字符串化得到异常结果。
以下是几种可行的解决方案:
方案1:编译时给路径添加转义引号
在编译参数中给路径包裹转义后的引号,让预处理器直接将MYPATH识别为完整字符串,避免内部宏被展开:cc -DMYPATH=\"/usr/linux/path\" prog.c也可以用单引号避免shell解析引号:
cc -DMYPATH='/usr/linux/path' prog.c方案2:修改代码宏定义,跳过参数预展开
原代码的STR(x)会先展开参数再执行字符串化,调整宏为直接对参数字符串化,阻止linux宏被替换:#include <stdio.h> #define STR(x) #x int main() { const char *s = STR(MYPATH); puts(s); }编译命令保持原命令即可:
cc -DMYPATH=/usr/linux/path prog.c方案3:单独保护路径中的
linux字段
在编译参数中给linux单独加引号,使其被视为字符串的一部分,避免被识别为宏:cc -DMYPATH=/usr/"linux"/path prog.c
内容的提问来源于stack exchange,提问作者ST0
相关产品推荐
相关产品推荐

