‘#’在C中究竟做了什么?

我有一个程序。

#include  #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf("%s\n",h(f(1,2))); printf("%s\n",g(f(1,2))); return 0; } 

该程序正常工作并输出如下:

 12 f(1, 2) 

我不明白编译器如何给出这个输出。

a##b#a中#的function是什么?

让我为你分解一下:

 #define f(a,b) a##b //2 this macro is evaluated first with a = 1 and b = 2 it concatenates them and returns 12 #define g(a) #a //4 g turns 12 into "12" (string) #define h(a) g(a) //3 back to h which now has a = 12 and call g() int main() { printf("%s\n",h(f(1,2)));//1 printf calls the macro h() and gives it the macro f() as an argument printf("%s\n",g(f(1,2)));// g here turns f(1,2) into "f(1,2)" (string) return 0; } 

##将两个令牌连接在一起。

重要的是它只能在预处理器中使用。

#运算符用于字符串化标记。

例如:-

#(a ## b)成为变成"ab" #ab

所以h(f(1,2))变成“f(1,2)”

另请注意, ###是两个不同的运算符。

预处理程序运算符##提供了一种在宏扩展期间连接实际参数的方法。 如果替换文本中的参数与##相邻,则参数将被实际参数替换,##和周围的空白区域将被删除,并重新扫描结果。

另请查看此连接以获取更多详细信息。

从这里 : –

字串

有时您可能希望将宏参数转换为字符串常量。 参数不会在字符串常量内替换,但您可以使用‘#’预处理运算符 。 当宏参数与前导“#”一起使用时,预处理器将其替换为实际参数的文字文本,并转换为字符串常量。 与普通参数替换不同,参数不是首先进行宏扩展。 这称为字符串化。

无法将参数与周围文本组合在一起并将其全部串联起来。 相反,您可以编写一系列相邻的字符串常量和字符串化参数。 预处理器将使用字符串常量替换字符串化的参数。 然后,C编译器将所有相邻的字符串常量组合成一个长字符串。

##被称为“令牌粘贴”操作符,或“合并”操作符,可用于组合两个令牌以形成实际参数。

#称为字符串化运算符,它“将宏参数转换为字符串文字而不扩展参数定义”。

这些通常称为预处理器操作符。 还有一些像这样的预处理器运算符。 有关更多说明,请查看C中的预处理器操作符( http://msdn.microsoft.com/en-us/library/wy090hkc.aspx )。


另请查看http://msdn.microsoft.com/en-us/library/3sxhs2ty.aspx以及该页面的“另请参见”部分,以获取有关C预处理器的更多信息。