字符串运算符(|)
数字符号或 “字符串”运算符 (#) 将宏参数转换为字符串,而外接参数定义。 它只与采用参数的宏。 如果它前面放置一个宏定义的形参,宏调用中传递的实参括在引号内并将字符串。 字符串然后替换字符串的运算符和形参的组合的每个匹配项宏定义中。
备注
对以前扩展宏形参出现的内部字符串和字符常数的 ANSI C 标准的 Microsoft C (版本 6.0 和早期版本) 扩展不再受支持。使用字符串 (#) 运算符,代码取决于此扩展应复盖。
在实参的第一个标记和在实参的最后一个标记后的空格将被忽略。 在标记之间的所有空格在实参减少到结果字符串文本的一个空白。 因此,因此,如果注释发生在实参的两个标记之间,因此它减少为单个空格。 结果字符串文本自动联接与它仅由空格分隔的任何相邻字符串。
此外,该代码,则在参数中包含的字符在字符串通常需要转义序列,当使用 (例如,引号 (“) 或斜杠 (\) 字符),必需的反斜杠转义字符在之前会自动插入。
字符串运算符的 Visual C++ 可能不会象预期在所有情况下,请参见 16.3.2 |运算符 有关更多信息。
示例
下面的示例演示一个包含字符串的运算符和一个主函数调用宏的宏定义:
在预处理期间,这种调用将展开,将生成以下代码:
int main() {
printf_s( "In quotes in the printf function call\n" "\n" );
printf_s( "\"In quotes when printed to the screen\"\n" "\n" );
printf_s( "\"This: \\\" prints an escaped double quote\"" "\n" );
}
// stringizer.cpp
#include <stdio.h>
#define stringer( x ) printf_s( #x "\n" )
int main() {
stringer( In quotes in the printf function call );
stringer( "In quotes when printed to the screen" );
stringer( "This: \" prints an escaped double quote" );
}
下面的示例演示如何扩展宏参数:
// stringizer_2.cpp
// compile with: /E
#define F abc
#define B def
#define FB(arg) #arg
#define FB1(arg) FB(arg)
FB(F B)
FB1(F B)