Stringizing Operator (#)

在 assert.h 里面有个叫 _assert的函数 _CRTIMP void __cdecl _assert(void *, void *, unsigned);

也有这个#define assert(exp) (void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )

那么请问 #exp里面的 "#"是什么意思?运算符?
---------------------------------------------------------------------------

转换为字符串
比如#define TURN(exp) #exp

在程序中可以写这样的语法
printf( "%s", TURN(test) );
输出结果为: test
---------------------------------------------------------------------------

The following example shows a macro definition that includes the stringizing operator and a main function that invokes the macro:

#define stringer( x ) printf( #x "/n" )

void main()
{
    stringer( In quotes in the printf function call/n );
    stringer( "In quotes when printed to the screen"/n );  
    stringer( "This: /"  prints an escaped double quote" );
}

Such invocations would be expanded during preprocessing, producing the following code:

void main()
{
   printf( "In quotes in the printf function call/n" "/n" );
   printf( "/"In quotes when printed to the screen/"/n" "/n" );
   printf( "/"This: ///" prints an escaped double quote/"" "/n" );
}

When the program is run, screen output for each line is as follows:

In quotes in the printf function call

"In quotes when printed to the screen"

"This: /" prints an escaped double quotation mark"

-----------------------------------------------------------------------------

#, ##
The # and ## operators are used with the #define macro. Using # causes the first argument after the # to be returned as a string in quotes. Using ## concatenates what's before the ## with what's after it.

Example code:
For example, the command

   #define to_string( s ) # s          

will make the compiler turn this command

   cout << to_string( Hello World! ) << endl;              

into

   cout << "Hello World!" << endl;               

Here is an example of the ## command:

   #define concatenate( x, y ) x ## y
   ...
   int xy = 10;
   ...         

This code will make the compiler turn

   cout << concatenate( x, y ) << endl;            

into

   cout << xy << endl;             

which will, of course, display '10' to standard output.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值