C语言-预处理(2)
C语言-预处理(1)
起因
之前对预处理、宏定义、条件编译,以及文件包含做了个小小总结。涉及而又常用的预处理相关知识还有一些,这次仍然粗略记下。
预处理操作符
C 语言中有两个预处理操作符:#(字符串化运算符)、##(记号粘贴运算符),都可以在 #define
中使用。
字符串化运算符
“#” 的操作数必须是宏替换文本中的形参。 其作用是:用双引号 将这个形参对应到的实参 包起来。来一个简单的示例:
#include <stdio.h>
#define GREET(name) ("Hello " #name)
int main()
{
printf("%s\n", GREET(Guan));
}
// 输出:
Hello Guan
尤其注意,这里的 Guan 没做定义或申明,但可以直接使用。再来看个列子:
#include <stdio.h>
#define GREET(name) ("Hello " #name)
int main()
{
char* Guan = "Zhong"; // Guan 是一个 char* 的指针
puts(Guan);
printf("%s\n", GREET(Guan));
}
// 输出:
Zhong
Hello Guan
也就是说,操作符 # 不管操作数是不是变量,总之直接将它字符串化,而且是将操作数的表面字符串化。我们再看看上述代码预处理之后的结果:
// example.i
...
int main()
{
char* Guan = "Zhong";
puts(Guan);
printf("%s\n", ("Hello " "Guan"));
// 编译器会自动合并紧邻的字符串 =》 "Hello Guan"
}
这样做有什么好处吗?那必然是有的,至少可以简化代码。像下面这样:
#include <stdio.h>
#define PRINT(fmt, value) printf("Value of " #value " is " fmt "\n", value)
int main()