#运算符用于将宏参数转换为字符串字面量。这通常用于调试或日志记录,将参数的值以字符串形式输出。
#include <iostream>
#define LOG(para) printf("%d,%s\n",para,#para)
int main() {
LOG(10);
return 0;
}
#include <iostream>
// #define LOG(para) printf("%d,%s\n",para,#para)
#define str(x) #x
int main() {
char* s=str(10);
std::cout<<s;
return 0;
}
##
运算符用于将两个标记(tokens)拼接成一个单独的标记。这在需要动态生成标识符时非常有用。
#define MAKE_ID(a, b) a##b
int main() {
int value123 = 42;
int id = MAKE_ID(value, 123);
return 0;
}
#__VA_ARGS__
是 #
和 __VA_ARGS__
的组合,用于将可变参数列表转换为字符串。这在定义可变参数宏时非常有用,特别是在需要将参数列表作为字符串输出时。
#define LOG(...) printf("Message: " #__VA_ARGS__)
int main() {
LOG(Hello, world!);
return 0;
}
##__VA_ARGS__
##__VA_ARGS__
是 ##
和 __VA_ARGS__
的组合,用于处理可变参数为空的情况。当没有参数传递给宏时,##
会移除多余的逗号,避免语法错误。
#include <iostream>
#define LOG(level, ...) printf(level, ##__VA_ARGS__)
int main() {
LOG("Hello, world!","aaa");
LOG("a");
return 0;
}