例如我有一个宏:
#define PRINT(int) printf(#int "%d\n",int)
我有点知道结果是什么。但是#int 怎么会代表整个事情呢?
我有点忘记这个细节了。任何人都可以给我一个提示吗?
谢谢!
在这种情况下(应用于宏定义中的参数引用),井号表示将此参数扩展为传递给宏的参数的文字文本。
在这种情况下,如果您调用PRINT(5)
宏扩展将是printf("5" "%d\n", 5);
which 将打印5 5
; 不是很有用;但是,如果您调用PRINT(5+5)
宏扩展将是printf("5+5" "%d\n", 5+5);
哪个 print 5+5 10
,那么微不足道。
这个例子在 C 预处理器的教程中进行了解释(顺便说一下,它是谷歌第一次点击c 宏磅符号)。
“#”可以显示变量的名称,最好将宏定义为:
#define PRINT(i) printf(#i " = %d\n", i)
并像这样使用它:
int i = 5;
PRINT(i);
结果显示:
i = 5
这是宏参数名称的错误选择,但无害(感谢dreamlax)。
基本上如果我这样写
PRINT(5);
它将被替换为
printf("5" "%d\n",5);
或者
printf("5 %d\n",5);
这是一个称为Stringification的过程,#int 被替换为由其内容组成的字符串,5 -> "5"
'#' 称为字符串化运算符。Stringize 运算符在传递的参数周围加上引号并返回一个字符串。它仅用于带参数的 marco 语句中。
#include<stdio.h>
#define stringLiteral(sl) #sl
int main()
{
char StringizeOpreator = 'a';
printf(stringLiteral(StringizeOpreator));
return 0;
}
在这里,stringLiteral
marco 接受形式参数sl
并返回#sl
。传递的实际参数是StringizeOpreator
可变的。return 语句#sl
有#
运算符,它在参数周围加上引号"StringizeOpreator"
并返回一个字符串。
所以上述程序的输出是实参'StringizeOpreator'的名称,而不是传递的实参中存储的值。
output :
StringizeOperator
...
exitcode 0
要了解更多信息,请访问此链接: 字符串化运算符