1. #运算符

(1)#运算符用于在预处理期将宏的参数转换为字符串

(2)#的转换作用是在预处理期完成的,因此只在宏定义中有效,即其他地方不能用#运算符

(3)用法:#define STRING(x) #x

printf("%s\n",STRING(Hello World!));//注意,Hello World!不加引号!

#include <stdio.h>
#define STRING(x) #x
int main()
{
//注意宏参数不用加引号,#运算符在宏替换时会自动加上去
printf("%s\n",STRING(Hello World!)); //"Hello World!"
printf("%s\n",STRING()); //"100"
printf("%s\n",STRING(while)); //"while"
printf("%s\n",STRING(return)); //"return"
return ;
}

#运算符的妙用

#include <stdio.h>
//注意宏后面的为逗号表达式,返回的是第 1 个表达式的值
//该宏最大的用处在于,可以输出被调用的函数的名称
#define CALL(f,p) (printf("Call function %s\n",#f),f(p)) int square(int n)
{
return n*n;
} int func(int x)
{
return x;
} int main()
{
int iRet = ;
//将函数名称作用宏参数,利用#运算符将这个名称转为字符串输出
//同时,逗号表达式最后一个式子调用相应的函数
iRet = CALL(square,);
printf("result = %d\n",iRet);//输出函数名,并调用函数
iRet = CALL(func,);
printf("result = %d\n",iRet);//输出函数名,并调用函数
return ;
}

2. ##运算符

(1)##运算符用于在预处理期粘连两个标识符

(2)##的连接作用是在预处理期完成的,因此只在宏定义中有效。

(3)编译器不知道##的连接作用

(4)用法:

#define CONNECT(a,b) a##b

int CONNECT(a,1); //int a1;

a1 = 2;

#include <stdio.h>
#define NAME(n) name##n
int main()
{
int NAME(); //name1;
int NAME(); //name2;
NAME() = ; //name1 = 1;
NAME() = ; //name2 = 2;
printf("%d\n",NAME());
printf("%d\n",NAME());
return ;
}

##运算符的工程应用

#include <stdio.h>
//该宏可以方便定义结构体,并给结构体命名。
//省去每次在定义结构体时,都要重复地写上
//typedef struct ....之类的相同代码
#define STRUCT(type) \
typedef struct _tag_##type type;\
struct _tag_##type
//定义结构体,并命名为 Student
STRUCT(Student)
{
char* name;int id;
}; int main()
{
Student s1;
Student s2;
s1.name = "s1";
s1.id = ;
s2.name = "s2";
s2.id = ;
printf("s1.name = %s\n",s1.name);
printf("s1.id = %d\n",s1.id);
printf("s2.name = %s\n",s2.name);
printf("s2.id = %d\n",s2.id);
return ;
}

参考资料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html

C语言学习笔记--#和##操作符的更多相关文章

  1. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  2. 2017-04-21周C语言学习笔记

    C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...

  3. 2017-05-4-C语言学习笔记

    C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...

  4. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

  5. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  6. Go语言学习笔记十三: Map集合

    Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. ...

  7. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  8. Go语言学习笔记十一: 切片(slice)

    Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...

  9. Go语言学习笔记十: 结构体

    Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...

随机推荐

  1. 使用 Spring Boot 快速构建 Spring 框架应用

    Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.S ...

  2. 根据图片名字在drawable中得到图片

    int imageId = context.getResources().getIdentifier("图片的名字","drawable", "包名& ...

  3. [Kafka] - Kafka内核理解:消息存储机制

    一个Topic分为多个Partition来进行数据管理,一个Partition中的数据是有序.不可变的,使用偏移量(offset)唯一标识一条数据,是一个long类型的数据 Partition接收到p ...

  4. js对象数组 根据某个共同字段 分组

    var arr = [ {"id":"1001","name":"值1","value":" ...

  5. 教你们在cmd里运行打开游戏,效率很快的。喜欢吧?

    第一步安装好的游戏 环境变量 变量值:把刚才复制好粘贴在里面,前面不用删除. 喜欢吧?这招非常好用.

  6. lamp script

    centos6 ,不区分32位,64位, 要求机器可以上外网. 支持lamp 和 lnmp, mysql支持5.1和5.6两个版本,php支持5.3和5.6两个版本,apache2.2,nginx1. ...

  7. nyoj-1278-Prototypes analyze(二叉排序树模板)

    题目链接 思路:建树之后,判断有多少种不同的树. 判断不同的树,简单的思路是遍历数组,判断数组后面是否存在一样的树 /* Name:NYOJ-1278-Prototypes analyze Copyr ...

  8. MySQL学习之一数据库简介

    1.什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,长期储存在计算机内.有组织的.可共享的数据集合. 数据库中的数据指的是以一定的数据模型组织.描述和储存在一起. ...

  9. msyql acid特性

    以下内容出自<高性能MySQL>第三版,了解事务的ACID及四种隔离级有助于我们更好的理解事务运作. 下面举一个银行应用是解释事务必要性的一个经典例子.假如一个银行的数据库有两张表:支票表 ...

  10. 微信小程序switch组件尺寸控制

    1.修改switch组件的属性值 /* switch */ .wx-switch-input{ width: 82rpx!important; height: 40rpx!important; } / ...