1. 主页
  2. 文档
  3. C语言教程
  4. C语言运算符
  5. C 中的 # 和 ## 运算符

C 中的 # 和 ## 运算符

字符串化运算符 (#)

此运算符导致相应的实际参数用双引号引起来。# 运算符,通常称为stringize运算符,将它前面的参数转换为带引号的字符串。
示例:

  • 以下预处理器将行 printf(mkstr(52cxydh)); 进入 printf(“52cxydh”);
// CPP program to illustrate (#) operator
#include <stdio.h>
#define mkstr(s) #s
int main(void)
{
printf(mkstr(52cxydh));
return 0;
}

输出:

52cxydh

  • 在这个程序中,a 的值被宏替换。
// CPP program to illustrate (#) operator
#include <iostream>
using namespace std;

#define a 8.3297

int main()
{
cout << "Value of a is " << a << endl;

return 0;
}

输出:

Value of a is 8.3297
  • 该程序使用宏找出两个数字中的最大值
// CPP program to illustrate (#) operator
#include <iostream>
using namespace std;

#define MAX(i, j) (((i) > (j)) ? i : j)

int main()
{
int a, b;

a = 250;
b = 25;

cout << "The maximum is " << MAX(a, b) << endl;

return 0;
}

输出:

The maximum is 250

标记粘贴运算符 (##)

允许将用作实际参数的标记连接起来形成其他标记。在扩展宏时将两个标记合并为一个通常很有用。这称为令牌粘贴或令牌连接。’##’ 预处理运算符执行令牌粘贴。扩展宏时,每个“##”运算符两侧的两个标记组合成一个标记,然后替换宏扩展中的“##”和两个原始标记。
例子 :

  • 预处理器转换 printf(“%d”, concat(x, y)); 进入 printf(“%d”, xy);

// CPP program to illustrate (##) operator
#include <stdio.h>
#define concat(a, b) a##b
int main(void)
{
int xy = 30;
printf("%d", concat(x, y));
return 0;
}

输出:

30

应用: ## 提供了一种在宏扩展期间连接实际参数的方法。如果替换文本中的参数与## 相邻,则将参数替换为实际参数,删除## 和周围的空白,并重新扫描结果。

 

这篇文章对您有用吗?