如何通过GCC命令行传递以数字开头的字符串宏定义?
GCC命令行正确传递字符串宏定义的解决方法
问题代码
#include <stdio.h> #ifndef MYVERSION #define MYVERSION "" #endif // SO:1562074 #define XSTR(x) STR(x) #define STR(x) #x #pragma message( " MYVERSION " XSTR(MYVERSION)) int main(void) { printf("MYVERSION is: '%s'", MYVERSION); }
问题现象
编译上述代码时,不通过命令行定义MYVERSION宏的情况下,程序可正常编译运行。但尝试通过命令行将MYVERSION设置为字符串"60c5158"时,会触发编译错误:invalid suffix "c5158" on integer constant,即便手动添加引号也无法解决。
解决方法
问题源于shell对引号的解析逻辑,以及GCC会将无引号的60c5158误判为带非法后缀的整数常量。以下两种方式可正确传递字符串宏:
方式一:单引号包裹带双引号的宏值
在类Unix shell环境中,用单引号包裹包含双引号的字符串,确保shell不会剥离双引号,直接传递给GCC:gcc -DMYVERSION='"60c5158"' test_print.c -o test_print此时GCC会将
MYVERSION正确定义为"60c5158",与代码默认的宏格式一致。方式二:转义双引号
通过反斜杠转义双引号,让shell保留双引号并传递给GCC:gcc -DMYVERSION=\"60c5158\" test_print.c -o test_print这种方式同样能让GCC接收到带双引号的字符串宏定义。
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

