在 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
#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