C语言中的#,##
今天在分析一份源码的时候遇到了如下代码:
#define CASE(x,y) case x: _bsd_setlasterror(anApplInstance, BSD_ ## y); break
觉得其中的##很有意思,于是就将这个知识点整理一下。#和##都是预处理指令,我们先看#。 #用来把参数转换成字符串,请看下面的两个例子。
例子一:
#include <stdio.h>
#include <iostream>
#define P(A) printf("%s:%d\n",#A,A);
int main(int argc, char **argv)
{
int a = 1, b = 2;
P(a);
P(b);
P(a+b);
system("pause");
}
例子二:
#define SQR(x) printf("The square of x is %d.\n", ((x)*(x)));
如果这样使用宏:SQR(8);
则输出为:The square of x is 64.
注意到没有,引号中的字符x被当作普通文本来处理,而不是被当作一个可以被替换的语言符号。
假如你确实希望在字符串中包含宏参数,那我们就可以使用“#”,它可以把语言符号转化为字符串。上面的例子改一改:
#define SQR(x) printf("The square of "#x" is %d.\n", ((x)*(x)));
再使用:SQR(8);
则输出的是:The square of 8 is 64.
和#运算符一样,##运算符可以用于宏函数的替换部分。这个运算符把两个语言符号组合成单个语言符号。看例子:
#define XNAME(n) x ## n
如果这样使用宏:XNAME(8)
则会被展开成这样:x8
##就是个粘合剂,将前后两部分粘合起来,也就是有“字符化”的意思。但是“##”不能随意粘合任意字符,必须是合法的C语言标示符。在单一的宏定义中,最多可以出现一次“#”或“##”预处理操作符。如果没有指定与
“#”或“##”预处理操作符相关的计算次序,则会产生问题。为避免该问题,在单一的宏定义中只能使用其中一种操作符(即,一份“#”或一个“##”,或都不用)。除非非常有必要,否则尽量不要使用“#”和“##”。
分享到:
相关推荐
这是一篇关于C语言宏定义##连接符和#符的使用的介绍说明
本文主要介绍了c语言中“#” “##”的使用方法与区别。
在C语言设计,要用到#和##,但详细论述起作用,并提供实例的文章很少。该文详细介绍了#和##的用途,并通过实例进行了演示
本文主要介绍了C语言中#与##运算符的用法与区别。
C语言宏中#和##的用法[文].pdf
本文详细描述了在c语言中,预编译描述符#与##的用法,并且给出了相当多的实例,使读者能够融会贯通这两个符号的用法
一般用法:我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. 当宏参数是另一个宏的时候,需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开. '#'和'##'的一些应用特例 :##的作用之一...
C语言头文件#includeunistd.h的作用
销售管理系统(C语言)
通讯录管理系统2(C语言)
学生信息管理系统(C语言)
图书管理系统代码(C语言)
描述了在C语言中的#ifdef等宏及妙用
图书管理系统设计(C语言)
程序设计基础(C语言)上机考试题
高级语言程序设计(C语言)实验指导书
《程序设计基础》(C语言)实践报告
体育商品销售管理系统—源代码(C语言)
红绿灯控制交通模型的建立与算法(C语言).doc
[课程]Win-TC(C语言)贪吃蛇游戏程序设计