2007年9月26日星期三

关于可变宏参数

关于可变宏参数
2 想调用printf的时候打印每一行的行号
3 类似如下
4 printf("[%d]%s", __LINE__, "Hello World");
5
6 一直用gcc的扩展
7 #define P(fmt, arg...) \
8 printf("[%d]"fmt, __LINE__, ## arg);
9
10 当是这个很要命的是不能在vs下编译。
11 于是,linux程序移植到windows下面,而且想用vs编译器,就碰到问题了。
12 郁闷...
13 在网上寻求解答办法,经过大家的努力,出现了几个很cool的方法
14
15 1.
16 #define P(x) \
17 do { \
18 printf("[%d]", __LINE__); \
19 printf x; \
20 }while(0);
21 使用比较恶心 P(("Hello World %d", 1));
22 这里要两个括号
23
24 2.
25 #define P my_log_class(__FILE__)
26
27 class my_log_class
28 {
29 int m_line;
30 public:
31 my_log_class(int line) : m_line(line) {}
32 my_log_class & operator()(const char *fmt, ...) {
33 //变成函数,可以做任何事情了...
34 }
35 };
36
37 用法 P("Hello World %d", 1); 这里会临时产生一个class的
38 典型的c++
39
40 3.
41 #define P(fmt, ...) \
42 printf("[%d]"fmt, __VA_ARGS__)
43
44 不过这个是C99支持的,而且在gcc 3.4.1下面对P("hello");类型无法编译通过
45 vs8完美支持,其他我没试过
46
47 不过可以改成
48
49 #define P(...) \
50 do { \
51 printf("[%d]", __LINE); \
52 printf(__VA_ARGS__); \
53 }while(0)
54
55

没有评论: