This Article home page links: #,## in C + +, and "
Want to apply macros flexibly, inseparable #
from and ##
.
"
learning #
and ##
, first look at a "
Example:
#include <stdio.h>#include <string.h>int Main(){ Const Char* P1 = "Hello," "world!"; //A space Const Char* P2 = "Hello," "world!"; //Multiple spaces Const Char* P3 = " Hello, " "world!."; //No spaces Const Char* P4 = "hello,world!"; //A whole string Const Char* P5 = " Nihao, " "shijie!."; //A different string printf("P1 =%s, strlen (p1) =%d\ n", P1, strlen(P1)); printf("P2 =%s, strlen (p2) =%d\ n", P2, strlen(P2)); printf("p3 =%s, strlen (p3) =%d\ n", P3, strlen(P3)); printf("P4 =%s, strlen (p4) =%d\ n", P4, strlen(P4)); printf("P5 =%s, strlen (p5) =%d\ n", P5, strlen(P5)); return 0;}
The output is:
P1 = hello,world!, strlen (p1) = 12p2 = hello,world!, strlen (p2) = 12P3 = hello,world!, Strle N (p3) = 12P4 = hello,world!, strlen (p4) = 12P5 = nihao,shijie!, strlen (p5) =
View the constant string segment of a PE file and discover that only one string exists after the compiler has been optimized Hello,World!
.
That is to say, p1,p2,p3,p4 these four kinds of writing is equivalent, this is the premise that explains #
usage afterwards.
String Operation (#)
When used as a string operation, #
the primary role is to convert macro parameters to string constants without being extended.
Points:
- The space between the left and right sides of the macro definition parameter is ignored, and multiple spaces between tokens of the parameter are converted to a single space.
- The
- macro definition parameter contains the need for special meaning word such as
"
or \
, they are automatically preceded by an escape character \
.
or through the MSDN example to see easy to understand:
#define F ABC #define B def #define FB (ARG) #arg # Define FB1 (ARG) FB (ARG) fb ( f b ) fb1 ( f b )
When I first saw that the two lines pre-compile the effect is the same, but see the use of GCC-E compiled code, it is understood that MSDN on the "no extension" has a deeper understanding of the actual pre-compiled code:
"F B";"abc def";
Presumably the transformation process should be as follows:
FB(F B) --> #F B -->"F B" FB1(F B) --> FB1(abc def) --> FB(abc def) --> #abc def --> "abc def"
Tag Join operation (# #)
Connect multiple tokens to a token.
Points:
- It cannot be the first or last token in a macro definition.
- Before and after the space is optional.
To understand the examples on MSDN:
#include <stdio.h>#define Paster (n) printf_s ("token" #n "=%d", token# #n)int Token9 = 9;int Main(){ Paster(9);}
paster(9);
The preprocessing steps should be as follows:
paster(9);
printf_s( "token" #9 " = %d", token##9 );
printf_s( "token" "9" " = %d", token9 );
printf_s( "token9 = %d", token9 );
This should be a good understanding.
Refer to MSDN
- Stringizing Operator (#): http://msdn.microsoft.com/EN-US/library/7e3a913x (V=vs.110,d=hv.2). aspx
- Token-pasting Operator (# #): Http://msdn.microsoft.com/EN-US/library/09dwwt6y (V=vs.110,d=hv.2). aspx
#,## in C + +, and "