【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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git操作大全

git操作大全系统的整理一下git操作二级目录三级目录系统的整理一下git操作 命令功能git branch -a查看当前所有的分支&#xff08;远端和本地&#xff09;git branch -vv查看当前分支的细节git branch -D mybranch删除名字为mybranch的分支git checkout mybranch切换mybranch分…

【MATLAB】 csvwrite数据缺失怎么办

MATLAB csvwrite数据缺失怎么办 csv文件介绍 csv文件是一种以纯文本形式存储表格数据并使用逗号分割符分割结构的文件格式&#xff0c;其中&#xff0c;逗号表示数据之间的列分割&#xff0c;换行符表示数据之间的行分割。 csv文件通常用于二维数据的存储&#xff0c;十分适…

【Leetcode1365】有多少小于当前数字的数字:详解

[Leetcode1365] 有多少小于当前数字的数字 1. 题目 给你一个数组 nums&#xff0c;对于其中每个元素 nums[i]&#xff0c;请你统计数组中比它小的所有数字的数目。 换而言之&#xff0c;对于每个 nums[i] 你必须计算出有效的 j 的数量&#xff0c;其中 j 满足 j ! i 且 nums…

【interview17.10】 主要元素:详解

interview17.10 主要元素 1.题目 数组中占比超过一半的元素称之为主要元素。给定一个整数数组&#xff0c;找到它的主要元素。若没有&#xff0c;返回-1。 2.算法 3.排序算法 计数器 解题思路&#xff1a;从题干分析&#xff0c;我们需要找到数组中数量占比多于一半&…

【C语言基础】C语言构建定长字典

C语言构建定长字典 1.C语言简介-struct C语言中没有字典。而有些场合下需要统计一些字符串变量的累计值&#xff0c;就需要用定长字典。定长字典顾名思义就是长度固定的字典。在C语言中结构体可以定义任意类型数据的集合&#xff0c;也就可以通过结构体数组来构造个定长字典。…

【Leetcode819】最常见的单词

Leetcode819 最常见的单词 1.题目 给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多&#xff0c;同时不在禁用列表中的单词。 题目保证至少有一个词不在禁用列表中&#xff0c;而且答案唯一。 禁用列表中的单词用小写字母表示&#xff0c;不含标点…

[LCP28] 采购方案

LCP 28 采购方案 1.题目 小力将 N 个零件的报价存于数组 nums。小力预算为 target&#xff0c;假定小力仅购买两个零件&#xff0c;要求购买零件的花费不超过预算&#xff0c;请问他有多少种采购方案。 注意&#xff1a;答案需要以 1e9 7 (1000000007) 为底取模&#xff0c…

搜索引擎排序DEMO

搜索引擎排序DEMO #include<stdio.h>int lookarr(int* arr, int arrSize) {for (int i 0; i < arrSize; i) {printf("%d, ", arr[i]);}printf("\n"); }int lookarr2(int** arr, int arrSize) {printf("\n");for (int i 0; i < 6;…

[Leetcode16]最接近的三数之和

[Leetcode16]最接近的三数之和 转载自leetcode https://leetcode-cn.com/problems/3sum-closest/ 1.题目 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数&#xff0c;使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在…

高压特种作业考试易错总结

高压上岗证考试&#xff0c;2021年6月考过啦&#xff0c;发出来与大家共勉。 安全&#xff1a; 安全责任 —— 横向到边、纵向到底电工作业人员根据实际情况遵守法规&#xff08;错&#xff0c;&#xff09;应该严格遵守。脱离电源 —— 单手操作&#xff0c;绝缘工具防止电气…

DEEPIN教程 - 本地安装Typora

本地安装Typora 一. 下载Typora安装包 访问https://www.typora.io/#linux路径进行下载。 二. 解压下载的tar.gz文件 tar -xvf Typora-linux-x64.tar.gz三. 将解压后的可执行文件添加到dash路径 1. 首先在解压路径下需要关注如下路径文件。 可执行文件Typora 和 2. 文件夹i…

函数指针史上最全的介绍

函数指针 一. 函数指针的概念 如果在程序中定义了一个函数&#xff0c;那么在编译时系统就会为这个函数代码分配一段存储空间&#xff0c;这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放&#xff0c;这…

C语言调试技巧:stdin,stdout,stderr

stdin,stdout,stderr流 介绍 stdin&#xff0c;stdout&#xff0c;stderr是标准的输入输出流。其中&#xff0c;stdin是访问键盘输入&#xff0c;stdout和stderr分别是向终端输出数据。 关键函数 fscanf/fprintf /* 所在头文件 */ #include <stdio.h>int fscanf(FILE…

C语言调试技巧:main函数输入参数

带入参的main函数 介绍 带入参的main函数主要用于一些基本调试&#xff0c;main函数的入参在main函数里被解析为字符串&#xff0c;因此根据具体的调试业务可以需要将字符串转为相应的int类型或double类型进行其他的操作。 函数实现 // test_mainin.c #include <stdio.h…

[Leetcode456]132模式 - 单调栈

[Leetcode456]132模式 - 单调栈 给你一个整数数组 nums &#xff0c;数组中共有 n 个整数。132 模式的子序列 由三个整数 nums[i]、nums[j] 和 nums[k] 组成&#xff0c;并同时满足&#xff1a;i < j < k 和 nums[i] < nums[k] < nums[j] 。 暴力遍历&#xff0c;…

[Deepin - Pycharm] PyQT5安装配置

[Deepin - Pycharm] PyQT5安装配置 1.环境依赖 python3基础环境&#xff0c; pip下载器 pycharm编辑器 2. 从系统环境中安装pyqt5, qtdesigner >>> pip install pyqt5 >>> sudo apt-get install pyqt5* >>> sudo apt-get install qt5-default …

[Deepin - Pycharm调试记录] Pyinstaller索引系统库问题

Deepin - Pycharm调试记录 - Pyinstaller索引不到系统库 现象 在Pycharm的Terminal中执行Pyinstaller指令时候遇到如下报错提示 OSError: Python library not found: libpython3.7mu.so.1.0, libpython3.7.so.1.0, libpython3.7.so, libpython3.7m.so.1.0, libpython3.7m.so…

Python学习笔记(5):Python如何忽略warning的输出

告警现象 形如下图文的告警信息都可以使用告警屏蔽 添加代码 源代码添加 import warnings warnings.filterwarnings("ignore")命令行执行 python -W ignore file.py可以避免warnings输出影响我们调试&#xff0c;但是不要盲目设置取消输出。因为告警内容可能包…

[Deepin - Pycharm调试记录] Matplot3D动态画图报错问题

Deepin - Pycharm调试记录 - Matplot3D动态画图报错问题 写在开头的话 应该不会有人傻到看这个wiki吧&#xff0c;我花了1个小时才发现问题&#xff0c;是我自己方法调错了。 这个wiki不会细致的教大家如何使用matplotlib进行动态画图&#xff0c;或者动态画图的几种办法&…

【C语言基础】C语言异常捕获机制 - setjmp

C语言异常捕获机制 - setjmp 快速入门 想快速入门该模块请访问&#xff1a;介绍&#xff0c;数据接口&#xff0c;示例代码 介绍 C语言没有C或Java的异常捕获机制&#xff0c;但可以通过setjmp/longjmp实现类似的效果&#xff1a; 使用setjmp保存当前执行环境到jmp_buf&am…