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

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

提问人:Anil 提问时间:11/11/2021 更新时间:11/11/2021 访问量:70

问:

#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 Management System\data\pwd.txt

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

|=== 构建文件:“无项目”中的“无目标”(编译器:未知)===| F:\c\projects\Banking Management 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”“ does not give a valid preprocessing token| F:\c\projects\Banking Management System\src\stringConcatMacro.c|9|note: 在宏的定义中 'PPCAT_NX'| F:\c\projects\Banking Management System\src\stringConcatMacro.c|15|note: in expansion of macro 'PPCAT'| F:\c\projects\Banking Management System\src\stringConcatMacro.c|15|注意:在宏“STR1”的扩展中| ||=== 构建失败:1 个错误、0 个警告(0 分钟、0 秒) ===|

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

第二种选择哪里出了问题?enter code here

任何帮助将不胜感激。

C GCC 代码块 预处理器指令

评论

0赞 KamilCuk 11/11/2021
只。不,你不能两个,这是不可能的。printf("%s", STR1 STR2);##"strings"
0赞 Anil 11/11/2021
@KamilCuk - 谢谢。有没有办法让用户在以下宏中输入STR2?: #define STR3 STR1 STR2
1赞 KamilCuk 11/11/2021
所以只是 ?这样的宏值有什么价值吗?只需写.#define STRCONCAT(a, b) a ba b
0赞 Nate Eldredge 11/11/2021
请记住,字符串文本连接仅适用于文本。如果文件名将在运行时提供,那么您也必须在运行时进行串联,with 或类似。strncat
0赞 Anil 11/11/2021
@KamilCuk - #define STRCONCAT(a, b) a b 非常适合我。这就是我要找的?我不想使用 strcat()、snprintf() 等将路径和文件名存储在变量中。 谢谢你的帮助。

答:

0赞 KamilCuk 11/11/2021 #1

第二种选择哪里出了问题?

规则是结果必须是“有效令牌”。 是标记,数字是标记,字符串文本也是标记的一个例子。连接两个字符串文本的结果不是单个有效标记。所以该操作无效。##STR11234"string"##"string""string"

无论如何,字符串文字都是连接在一起的,只需将它们并排编写即可。

#define STRLITERALCAT(a, b)  a b