Code::Blocks下GCC预处理器宏(Macro)字符串拼接报错问题
错误原因
##是C预处理器的令牌拼接运算符,仅用于将两个合法的预处理器令牌合并为单个新的合法令牌。你代码里的STR1和STR2本身都是独立的字符串字面量令牌,用##拼接后会得到"F:\c\projects\Banking Management System\data\""pwd.txt",这个内容包含两对连续的双引号,不属于任何合法的预处理器令牌类型,因此编译直接报错。- 你第一种写法能正常运行,是因为C标准本身就规定:相邻的字符串字面量会在编译阶段自动合并为一个字符串,根本不需要额外的拼接运算符。
解决方法
完全不需要自定义PPCAT类的拼接宏,直接将路径前缀宏和文件名字面量/文件名宏相邻放置即可,预处理器会自动完成拼接,完全满足你“固定前缀拼可变文件名”的需求。
另外注意原代码字符串中的单反斜杠\属于转义字符,最好写成双反斜杠\\保证跨编译器兼容性,修正后的示例代码如下:
#include<stdio.h> #include <string.h> // 路径前缀固定,注意反斜杠转义 #define STR1 "F:\\c\\projects\\Banking Management System\\data\\" // 可变文件名可按需定义,也可直接写字面量 #define FILE_PWD "pwd.txt" #define FILE_USER "user.dat" void main() { // 拼接宏定义的文件名 printf("\n%s", STR1 FILE_PWD); // 直接拼接字面量文件名,无需提前定义宏 printf("\n%s", STR1 "account.log"); }
以上代码编译运行后会正常输出拼接后的完整路径。
内容的提问来源于stack exchange,提问作者Anil
相关产品推荐
相关产品推荐

