在 Code::Blocks 中使用 gcc 的预处理器指令(宏)中的问题

Problems in pre-processor directive (Macro) using gcc in Code::Blocks

#include<stdio.h>
#include <string.h>

#define STR1 "F:\c\projects\Banking Management System\data\"
#define STR2 "pwd.txt"

#define STR3 STR1 STR2

#define PPCAT_NX(A, B) A##B
#define PPCAT(A, B) PPCAT_NX(A, B)


void main() {
    printf("\n%s", STR3);
    printf("\n%s ",PPCAT(STR1, STR2));
}

问题陈述

第一个 ("printf("\n%s", STR3);") 工作正常给了我想要的输出如下:

F:\c\projects\Banking管理System\data\pwd.txt

但是,第二个 (printf("\n%s ",PPCAT(STR1, STR2));" 给了我以下错误:

|===构建文件:“无项目”中的“无目标”(编译器:未知)===| F:\c\projects\Banking管理System\src\stringConcatMacro.c||函数中'main':| F:\c\projects\Banking Management System\src\stringConcatMacro.c|4|error: 粘贴“"F:\c\projects\Banking Management System\data\"" 和 ""pwd.txt""未提供有效的预处理令牌| F:\c\projects\Banking管理System\src\stringConcatMacro.c|9|注意:在宏定义中'PPCAT_NX'| F:\c\projects\Banking Management System\src\stringConcatMacro.c|15|注意:在宏扩展中'PPCAT'| F:\c\projects\Banking Management System\src\stringConcatMacro.c|15|注意:在宏扩展中'STR1'| ||=== 构建失败:1 个错误,0 个警告(0 分钟,0 秒)===|

我想使用第二种方法,其中我可以通过我的路径 (STR1) 传递不同的文件名(而不是使用固定的 STR2)。

第二个选项哪里出了问题? enter code here

任何帮助将不胜感激。

Where are the things going wrong with the 2nd option?

规则是 ## 的结果必须是“有效标记”。 STR1是一个token,一个数字1234是一个token,一个字符串文字"string"也是一个token的例子。 ## 连接两个字符串文字的结果,如 "string""string" 不是一个有效的标记。所以操作无效。

字符串字面量无论如何都是连在一起的,把它们并排写就行了。

#define STRLITERALCAT(a, b)  a b