宏定义实现字符串引用
- 原理
- 最简单的引用策略
- 使用#进行转义
原理
用宏定义实现字符串引用: 这种做法在编译的时候直接给宏名所对应的字符串 分配了一个内存地址空间,可以进行字符串输出、地址打印、指针操作和索引操作。
最简单的引用策略
最简单的引用策略就是直接用宏定义来定义带有引号的字符串,如下代码片所示。
code
#include <stdio.h>#define STR_HELLO "hello"int main() {printf("macro define str: %s\n", STR_HELLO);printf("macro define add: %d\n", STR_HELLO);printf("used as pointer: %s\n", STR_HELLO+1);printf("used as array : %c\n", STR_HELLO[1]);return 0;
}
这种做法在编译的时候直接给STR_HELLO 也就是字符串 “hello” 分配了一个内存地址空间,可以进行字符串输出、地址打印、指针操作和索引操作。
terminal
macro define str: hello
macro define add: 4210688
used as pointer: ello
used as array : e
使用#进行转义
但有的函数偏偏不学好,非要用宏转换来进行操作,就变成了这个样子。
code
#include <stdio.h>#define STR_HI hello
#define __parse_str(tag) #tag
#define parse_str(tag) __parse_str(tag)int main() {printf("macro define str: %s\n", parse_str(STR_HI));printf("macro define add: %d\n", parse_str(STR_HI));printf("used as pointer: %s\n", parse_str(STR_HI)+1);printf("used as array : %c\n", parse_str(STR_HI)[1]);return 0;
}
这种方式在linux内核里使用的较多。主要是用于dts解析,提高可读性,但是我个人感觉,还不如上面那种好用。
terminal
macro define str: hello
macro define add: 4210688
used as pointer: ello
used as array : e