学校网站设计制作目的,免费网站建设 免备案,东莞大朗现在有多少例,正邦设计创始人字符串化 通过C 语言的宏#xff08;MICRO#xff09;#xff0c;可以把数值或者一段字符的组合#xff0c;转换为字符串。 因为 C语言的宏在【预处理】阶段就展开了#xff0c;所以可以实现一些比较使用的功能#xff0c;比如一些数据的初始化操作 比如定义一个宏MICRO可以把数值或者一段字符的组合转换为字符串。 因为 C语言的宏在【预处理】阶段就展开了所以可以实现一些比较使用的功能比如一些数据的初始化操作 比如定义一个宏传入的宏的参数是一个 func 函数名经过宏的层层处理可以把这个函数名以字符串的方式取出来并赋值给结构体的 字符指针成员
示例 struct rt_init_desc{const char* fn_name;const init_fn_t fn;};#define INIT_EXPORT(fn, level) \const char __rti_##fn##_name[] #fn; \RT_USED const struct rt_init_desc __rt_init_desc_##fn SECTION(.rti_fn. level) \{ __rti_##fn##_name, fn};这里的 INIT_EXPORT 的 作用是 在 段中初始化一个数据结构代码可以通过变量多个这样的数据结构获取可执行函数的指针从而实现 【自动初始化】机制。 这个操作有两个特点1代码得到简化 2fn 函数名【字符串化】然后组合成一个新的字符串对数据成员 const char *fn_name 进行初始化
字符串化 宏定义中通过一个 # 就可以把 一串字符转换为字符串这里的一串字符可以是一个数值可以是一个函数指针函数名 如#fn 就把 fn 这个参数转换为 C 语言中的字符串常量了 字符串化最经典的 转换宏
#define __stringify_1(x...) #x
#define __stringify(x...) __stringify_1(x)__stringify_1(5) 获取的 是 5也就是 5 转换为 字符串 5 了 __stringify 的作用更强大如果传入的参数也是个【宏定义】会继续展开并转换
#define STRING_NAME 5
#define DEV_DEMO_NAME1 __stringify(STRING_NAME)这时 DEV_DEMO_NAME1 不再是 字符串 “STRING_NAME”而是 “5” 字符串连接 宏定义中通过两个 ## 可以把两个字符串连接起来也就是【拼接】起来 __rti_##fn##_name 如果 fn 为 hello则 展开后为 __rti_hello_name这里的 ## 起到了字符串拼接连接的作用展开后 ## 就不存在了
测试一下
#include stdio.h#define __stringify_1(x...) #x
#define __stringify(x...) __stringify_1(x)#define STRING_NAME 5
#define DEV_DEMO_NAME __stringify(5)
#define DEV_DEMO_NAME1 __stringify(STRING_NAME)
#define DEV_DEMO_NAME2 __stringify(DEVICE_NAME_HELLO)int main()
{printf(%s enter\n, __func__);printf(%s : DEVICE_NAME : %s \n, __func__, STRING_NAME);printf(%s : DEV_DEMO_NAME : %s \n, __func__, DEV_DEMO_NAME);printf(%s : DEV_DEMO_NAME1 : %s \n, __func__, DEV_DEMO_NAME1);printf(%s : DEV_DEMO_NAME2 : %s \n, __func__, DEV_DEMO_NAME2);return 0;
}测试环境为ubuntu 20.04 Linux 环境 编译$ gcc micro_string_test.c -o micro_string_test 运行效果
zhangszzhangsz-virtual-machine:~/linux/codes/202302/0212$ ./micro_string_test
main enter
main : DEVICE_NAME : 5
main : DEV_DEMO_NAME : 5
main : DEV_DEMO_NAME1 : 5
main : DEV_DEMO_NAME2 : DEVICE_NAME_HELLO 简单的解释 #define STRING_NAME 5 直接定义一个字符串 5而不是数值 5__stringify(5) 的作用把 5 转换为 字符串了这就是普通的 【字符串化】#define DEV_DEMO_NAME2 __stringify(DEVICE_NAME_HELLO)由于 DEVICE_NAME_HELLO 不是一个可以展开的【宏】所以依旧转换为普通的字符串 DEVICE_NAME_HELLO#define DEV_DEMO_NAME1 __stringify(STRING_NAME)由于 STRING_NAME 是个宏内容是 5所以再次展开为 5而不是 STRING_NAME注意这个 5 是有双引号的因为【宏】是【替换】
小结 在操作系统中C语言的宏非常的多有些宏定义使用起来跟函数相差不多有些宏的使用大大简化了代码量让代码看起来非常的整洁美观 当然过多的【宏】依旧需要不断的查看展开的效果过长的的【宏定义】加大了代码阅读的难度让代码晦涩难懂 宏定义的函数不利于软件【单步调试】