提问人:Anil 提问时间:11/11/2021 更新时间:11/11/2021 访问量:70
在 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 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
任何帮助将不胜感激。
答:
第二种选择哪里出了问题?
规则是结果必须是“有效令牌”。 是标记,数字是标记,字符串文本也是标记的一个例子。连接两个字符串文本的结果不是单个有效标记。所以该操作无效。##
STR1
1234
"string"
##
"string""string"
无论如何,字符串文字都是连接在一起的,只需将它们并排编写即可。
#define STRLITERALCAT(a, b) a b
下一个:为什么 fscanf 读取垃圾?
评论
printf("%s", STR1 STR2);
##
"strings"
#define STRCONCAT(a, b) a b
a b
strncat