从网上借鉴了一些内容,然后整理了一下三者的区别,记录一下。
#include <iostream>
// #: 用来把参数转换成字符串
#define LOG1(x) do { printf("%s=%d\n",#x,x); }while(0)
// ##:用于将带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串;但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元;
#define LOG2(x) log##x()
// __VA_ARGS__:用于在宏替换部分中,表示可变参数列表;
#define LOG(...) printf(__VA_ARGS__);
void logA() {
printf("log func A \n");
}
void logB() {
printf("log func B\n");
}
int main()
{
// 测试#
int score = 96;
LOG1(score);
LOG1(6);
// 测试##
LOG2(A);
// 测试 __VA_ARGS__
LOG("score is %d\n", 96);
getchar();
return 0;
}