【C语言进阶】 宏定义实现字符串引用

宏定义实现字符串引用

    • 原理
    • 最简单的引用策略
    • 使用#进行转义

原理

用宏定义实现字符串引用: 这种做法在编译的时候直接给宏名所对应的字符串 分配了一个内存地址空间,可以进行字符串输出、地址打印、指针操作和索引操作。

最简单的引用策略

最简单的引用策略就是直接用宏定义来定义带有引号的字符串,如下代码片所示。

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

你可能感兴趣的:(c语言,字符串,linux)