1.__LINE__、__FILE__、__DATE__、__TIME__、__STDC__、__FUNCTION__、__TIMESTAMP__
__FILE__ :宏在预编译时会替换成当前的源文件名
__LINE__:宏在预编译时会替换成当前的行号
__FUNCTION__:宏在预编译时会替换成当前的函数名称
2.#
3.宏连接符##
#include <stdio.h>
#define XNAME(n) x ## n
#define PRINT_XN(n) printf("x" #n " = %d\n", x ## n);
int main(void)
{
int XNAME(1) = 14; // becomes int x1 = 14;
int XNAME(2) = 20; // becomes int x2 = 20;
PRINT_XN(1); // becomes printf("x1 = %d\n", x1);
PRINT_XN(2); // becomes printf("x2 = %d\n", x2);
return 0;
}
4.可变参数宏....和__VA_ARGS__
如:#define gui_debug(...) printf("\n\r", ##__VA_ARGS__)
将左边宏中 ... 的内容原样抄写在右边 __VA_ARGS__ 所在的位置。它是一个可变参数的宏,是新的C99规范中新增的,
目前似乎只有gcc支持(VC从VC2005开始支持)。
note:
*宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错
example:
#if (GUICONFIG_DEBUG_ENABLE==2)
#define gui_debug(_fmt_, ...) printf("[gui]:"_fmt_"file:%s,func:%s,line:%d\n\r",##__VA_ARGS__,__FILE__,__FUNCTION__,__LINE__)
#elif (GUICONFIG_DEBUG_ENABLE==1)
#define gui_debug(_fmt_, ...) printf(_fmt_"\n\r", ##__VA_ARGS__)
#else
#define gui_debug(...)
#endif /* MENUCONFIG_DEBUG_ENABLE */
#include <stdio.h>
#include <math.h>
#define PR(X, ...) printf("Message" #X ": " _ _VA_ARGS_ _)
int main(void)
{
double x = 48;
double y;
y = sqrt(x);
PR(1, "x = %g\n", x);//print("Message " "1" ": " "x = %g\n", x);
PR(2, "x = %.2f, y = %.4f\n", x, y);
return 0;
}
Output:
Message 1: x = 48
Message 2: x = 48.00, y = 6.9282
参考:http://www.cnblogs.com/pengyingh/articles/2407265.html
__FILE__ :宏在预编译时会替换成当前的源文件名
__LINE__:宏在预编译时会替换成当前的行号
__FUNCTION__:宏在预编译时会替换成当前的函数名称
2.#
3.宏连接符##
#include <stdio.h>
#define XNAME(n) x ## n
#define PRINT_XN(n) printf("x" #n " = %d\n", x ## n);
int main(void)
{
int XNAME(1) = 14; // becomes int x1 = 14;
int XNAME(2) = 20; // becomes int x2 = 20;
PRINT_XN(1); // becomes printf("x1 = %d\n", x1);
PRINT_XN(2); // becomes printf("x2 = %d\n", x2);
return 0;
}
4.可变参数宏....和__VA_ARGS__
如:#define gui_debug(...) printf("\n\r", ##__VA_ARGS__)
将左边宏中 ... 的内容原样抄写在右边 __VA_ARGS__ 所在的位置。它是一个可变参数的宏,是新的C99规范中新增的,
目前似乎只有gcc支持(VC从VC2005开始支持)。
note:
*宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错
example:
#if (GUICONFIG_DEBUG_ENABLE==2)
#define gui_debug(_fmt_, ...) printf("[gui]:"_fmt_"file:%s,func:%s,line:%d\n\r",##__VA_ARGS__,__FILE__,__FUNCTION__,__LINE__)
#elif (GUICONFIG_DEBUG_ENABLE==1)
#define gui_debug(_fmt_, ...) printf(_fmt_"\n\r", ##__VA_ARGS__)
#else
#define gui_debug(...)
#endif /* MENUCONFIG_DEBUG_ENABLE */
#include <stdio.h>
#include <math.h>
#define PR(X, ...) printf("Message" #X ": " _ _VA_ARGS_ _)
int main(void)
{
double x = 48;
double y;
y = sqrt(x);
PR(1, "x = %g\n", x);//print("Message " "1" ": " "x = %g\n", x);
PR(2, "x = %.2f, y = %.4f\n", x, y);
return 0;
}
Output:
Message 1: x = 48
Message 2: x = 48.00, y = 6.9282
参考:http://www.cnblogs.com/pengyingh/articles/2407265.html