文档章节

宏定义中的连接符##和#

来来叔叔
 来来叔叔
发布于 2017/08/04 23:55
字数 336
阅读 2
收藏 0
 

1. C语言宏定义中的##用来连接符号

可以用##来连接宏定义中的一个或多个变量。

#define file_open(filename_tag, filename, mode)                             \
    FILE *filename_tag = fopen(filename, stdio_file_open_##mode)

file_open(game_config_file, game_config_filename, read);

语句将展开为

FILE *game_config_file = fopen(game_config_filename, stdio_file_open_read);

2.C语言宏定义中的#用来将符号转换为字符串

相当于把符号x前后加上双引号变成"x",如

#define TO_STRING(x) #x

char* str = TO_STRING(hello world);

将会展开为:

char* str = "hello world";

上述宏定义某些时候会非常有用,比如用来生成多种情形下的函数体。
下面是一个有趣的应用:
typedef void(*func_pointer)(void* data);
void func_1(void* data);
void func_2(void* data);
void func_3(void* data);。。。
#define TABLE(x) x
func_pointer func_array[4096]={TABLE(func_1), TABLE(func_2),...,TABLE(func_4096)};

如果需要做一个工具,输入函数名(字符串),然后算出在函数表中的索引,然后做后续处理。。。(假设这些函数名是没有规律的)
则可以这样:
#define TABLE(x) #x
func_pointer func_array[4096]={TABLE(func_1), TABLE(func_2),...,TABLE(func_4096)};
实际上就展开成了
char* func_array[4096]={“func_1”, “func_2”,...,“func_4096”};
根据根据输入的函数名(字符串),进行字符串匹配,就可以查到函数在数组中的下标了。
当然这是一个非常少见的应用。。。


© 著作权归作者所有

上一篇: 矩形滤波
来来叔叔
粉丝 0
博文 100
码字总数 55732
作品 0
广州
高级程序员
私信 提问
C语言宏定义##和#符的使用总结

最近在查找激光甲烷遥测仪有些主控板启动不了的原因时,顺便研究了TMS320VC5509A和STM32F407之间通过HPI接口的程序引导和利用CSL产生的HPI接口底层驱动程序,其中HPI接口底层驱动程序中使用了...

Zhj_定捷
2018/07/12
0
0
VC常用的宏的含义

一、字符编码宏 Windows即可以使用Unicode字符集又可以使用传统的字符集(如多字节编码)来实现对多种语言的支持,以适应国际市场的要求。 与传统的字符集编码器相比,Unicode是世界通用的字符...

tomy000
2014/08/15
0
0
C语言宏定义##连接符和#符的使用

转载文章经验技巧 在宏定义里,a##b就是把a,b联接起来, 比如f(1,2)就是12,但是是数。 #a就是把a转化成字串,并合并。 所以 printf("%sn",g(f(1,2)));就直接把f(1,2)转成字串了。 #define ...

shzwork
05/05
5
0
C语言宏的高级应用

关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量 通过替换后在其左右各加上一个双引号。比如下面代码中的宏: 那么...

长平狐
2013/01/11
104
0
C语言预处理功能 关于字符串化和符号粘贴

在C语言开发中,宏定义是一个非常有用的工具,它可以使我们的代码更容易理解,更容易维护。如查一个常量在多处被使用,且今后可能会根据不同需要而 修改的话,将其define一下那是再好不过了。...

被使用的文件
2015/09/23
110
0

没有更多内容

加载失败,请刷新页面

加载更多

JS基础-该如何理解原型、原型链?

JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个...

OBKoro1
今天
7
0
高防CDN的出现是为了解决网站的哪些问题?

高防CDN是为了更好的服务网络而出现的,是通过高防DNS来实现的。高防CDN是通过智能化的系统判断来路,再反馈给用户,可以减轻用户使用过程的复杂程度。通过智能DNS解析,能让网站访问者连接到...

云漫网络Ruan
今天
14
0
OSChina 周一乱弹 —— 熟悉的味道,难道这就是恋爱的感觉

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :好久没分享歌了分享张碧晨的单曲《今后我与自己流浪》 《今后我与自己流浪》- 张碧晨 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
3K
24
SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
46
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部