Stringizing Operator (#)

原创 2006年06月18日 23:09:00

在 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.

【C++】预处理定义操作符Stringizing Operator (#) ,Charizing Operator (#@), Token-Pasting Operator (##)

转载自http://pppboy.blog.163.com/blog/static/30203796201011501033268/一、开始前几天看代码,居然出来了“##”这个东东,不知道做什么的,学...
  • King_hhuang
  • King_hhuang
  • 2011年04月19日 22:52
  • 425

预处理定义操作符Stringizing Operator (#) ,Charizing Operator (#@), Token-Pasting Operator (##)

引用自:http://pppboy.blog.163.com/blog/static/30203796201011501033268/一、开始前几天看代码,居然出来了“##”这个东东,不知道做什么的,...
  • helonSY
  • helonSY
  • 2011年03月21日 17:21
  • 539

c/c++的预处理定义 Stringizing Operator (#) Charizing Operator (#@) Token-Pasting Operator (##)

c/c++的预处理定义: 一、Stringizing Operator (#) 在c和c++中数字标志符#被赋予了新的意义,即字符串化操作符。其作用是:将宏定义中的传入参数名转换成用一对双...
  • a36254094
  • a36254094
  • 2012年09月24日 14:37
  • 695

c/c++的预处理定义 Stringizing Operator (#) Charizing Operator (#@) Token-Pasting Operator (##)

c/c++的预处理定义:一。Stringizing Operator (#)在c和c++中数字标志符#被赋予了新的意义,即字符串化操作符。其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名...
  • conanlrj
  • conanlrj
  • 2009年11月30日 13:16
  • 515

c/c++的预处理定义 Stringizing Operator (#) Charizing Operator (#@) Token-Pasting Operator (##)

c/c++的预处理定义:一。Stringizing Operator (#)在c和c++中数字标志符#被赋予了新的意义,即字符串化操作符。其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名...
  • waji2000
  • waji2000
  • 2007年11月26日 10:21
  • 2601

operator关键字(重载操作符)

operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。  这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解: 一方面要使...
  • DaveBobo
  • DaveBobo
  • 2016年04月16日 21:58
  • 3525

请谨慎实现operator==操作符函数

请谨慎实现operator==操作符函数在c++中,==操作符是很有用的,但是它的实现也并非想象中的那样容易。本文将围绕一个简单的c++例子程序展开讨论,以便寻求一个简单的解决方法。在开始讲述等于操作...
  • hello_wyq
  • hello_wyq
  • 2007年02月06日 10:01
  • 3063

operator*( )的重载(对于const修饰的成员变量的理解)

一、问题 先来看看下面的程序: class INT { public: INT() { m_i = 20; } int& operator*()const { return m_i;...
  • LookAtTheStars
  • LookAtTheStars
  • 2016年07月03日 16:11
  • 1198

C++那些细节--中operator=相关问题

C++中关于operator=的相关知识整理,涉及深拷贝浅拷贝,以及一些拷贝构造函数的知识...
  • puppet_master
  • puppet_master
  • 2015年07月23日 14:09
  • 5998

operator=函数.

首先讲一下为什么要写operator=函数.这是一个不得不解决而又容易忽视的问题!当我们写一个类的时候, 正常情况下不需要为该类重载=运算符, 因为系统为每个类提供了默认的赋值运算符, 该操作会把这个...
  • howlet2
  • howlet2
  • 2009年12月28日 14:02
  • 20865
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Stringizing Operator (#)
举报原因:
原因补充:

(最多只允许输入30个字)