宏的单行定义

 #define A(x) T_##x
#define B
x) #@x

#define Cx) #x
我们假设:x=1,则有:

A(1)------
T_1
B(1)------
'1'
C(1)------
"1"

(这里参考了 hustli的文章)

 

http://www.cnblogs.com/dust/archive/2008/04/24/1169498.html

#define中的### && #@

前些一段时间在看WinCECode时发现在宏定义中有用到##,如下所示

 

 

#define GPEBLT_FUNCNAME(basename)       (SCODE (GPE::*)(struct GPEBltParms *))&GPE::##basename

#define中,标准只定义了###两种操作。#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串。

 

 1#define ToString(a) #a

 2ToString( A b Cd );      //A b Cd

 3ToString( A/n b Cd );   //A

 4                               // b Cd

 5ToString( A/ n b Cd );  //A n b Cd

 6

 7

 8#define ConCat(x, y) x ## y

 9ConCat( "ABC", "DEF" );

10ConCat( 123, 4);

11ConCat( 123.0, 5);

12//=================================

13//    Cat( 123.0, 5.5);

14//    Cat( 'a', 'b' );

15//    Cat( "ABC", 'd' );

16//    Cat( 'a', 1234 );

17//    Cat( "ABC", 1234 );

18//===== above can't compile =======

19

20

另外,在网上搜到还有一种用法:#@,把参数转换成字符

 

1#define ToChar(a) #@a

2ToChar(a);          // a

3ToChar(ab);         // b

4ToChar(abc);        // c

5ToChar(abcd);       // d

6//ToChar(abcde);    // too many characters in constant

7ToChar(1.);         // .

这个没在标准上看到。上述测试是在VS studio环境下做的。不知道GCC中是否有同样的用法。

 

你可能感兴趣的:(c,struct,gcc,测试,WinCE)