1. #运算符
#预处理运算符可以把参数转换成字符串
#define SQRT(x) printf("the square of "#x" is %d\n", ((x)*(x)))
int main()
{
SQRT(3);
return 0;
}
/* output: the square of 3 is 9 */
2. ##运算符
- ##运算符可以把两个几号组合成一个记号
#define XNAME(n) x ## n
XNAME(1)则会被组合成一个新的记号: x1
3. __VA_ARGS__宏
在宏定义中参数列表的最后一个参数为省略号(…),而预定义宏__VA_ARGS__则可以在宏定义的实现部分替换省略号所代表的字符串
下面的代码列出了使用__VA_ARGS__宏的实例
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <syslog.h>
#define LOG_PRINT(...) printf(__VA_ARGS__) /* 打印日志 */
#define LOG_SAVE(format, ...) do { func(format, ##__VA_ARGS__); } while (0) /* 按指定格式保存日志 */
void func(const char *format, ...)
{
va_list ap;
char buf[1024];
memset(buf, 0, sizeof(buf));
va_start(ap, format);
vsnprintf(buf, sizeof(buf), format, ap);
va_end(ap);
syslog(LOG_INFO, "%s", (const char *)&buf);
}
int main()
{
LOG_PRINT("[__VA_ARGS__] %s-0x%x-%d\n", "abcd", 0xFF, 1024);
LOG_SAVE("[__VA_ARGS__] %s-0x%x-%d", "abcd", 0xFF, 1024);
return 0;
}