能力值:
( LV10,RANK:170 )
|
-
-
2 楼
##后面的宏是不会展开的
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
我其实不是想它在##后在展开,而是在传参数时就展开,这样##后面的是展开后的值了
那如果要实现我想要的功能应该怎么写?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
## 后面的宏 不展开. 我那个 CONNECT 要转换二次(这里其实不用三次)就是要 解决这个问题
让参数在 遇到 ##之前 先展开.
#define CONNECT(a, b) CONNECT1(a, b)
#define CONNECT1(a, b) CONNECT2(a, b)
#define CONNECT2(a, b) a##b
#define FILENAME MyFile
#define DEFINEDATA(x) PVOID CONNECT(CONNECT(CONNECT(g_, FILENAME), _), x) = (PVOID)1234
int _tmain(int argc, _TCHAR* argv[])
{
DEFINEDATA(abc);
printf("%d\n", g_MyFile_abc);
int a = 1, b = 2;
char * c = "cccc";
Logs(a, b);
return 0;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
用函数不好吗
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
函数 能定义全局变量吗?
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
哦,是的
对了,你那个得到宏参数个数的原理是啥?
看了半天没看懂
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
这个宏也是从 别人那里看来的.
原理就是 __VA_ARGS__展开后.会 占用 参数的位置. 如果有 __VA_ARGS__ 10个.就占用10个位置
,再展开,输出的就是第11个位置上的那个数字.
#define COUNT_PARMS2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _, ...) _
#define REPEAT_PARAMS(...) (__VA_ARGS__)
#define COUNT_PARMS(...) COUNT_PARMS2 REPEAT_PARAMS(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
COUNT_PARMS2(A,B,C) => COUNT_PARMS2 ( A, B, C, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
=> (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _, ...) _
=> @ 就是这个
|
能力值:
( LV4,RANK:50 )
|
-
-
9 楼
非常谢谢你的解释,我现在明白了,原因在于我一直把_这个当字符理解去了,而没考虑到它是个参数名
|
能力值:
( LV4,RANK:50 )
|
-
-
10 楼
再问一个问题:
#define COUNT_PARMS(...) COUNT_PARMS2(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
与
#define COUNT_PARMS(...) COUNT_PARMS2 REPEAT_PARAMS(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
的本质区别在哪里?
为什么上面的写法就不对?
如:
COUNT_PARMS(xxx,yyy)
上面的返回1,下面的返回就是2
|
能力值:
( LV4,RANK:50 )
|
-
-
11 楼
还有,当调用时不写参数时,得到的参数也为1,导致拼接的东西不对,有好的办法处理不?
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
没想到. 也没找到好办法.
当没有参数时,那里还是有一个 ',' .
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
第一种写法. __VA_ARGS__没有正确展开.而是被当一个参数了.
|
能力值:
( LV4,RANK:50 )
|
-
-
14 楼
看到网上说GCC下支持##__VA_ARGS__能吃掉前面的,
vs下试了无效
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
可惜无法吃掉后面的. 总是有牛人有解决这个的办法.只是还没找到.
|