03.C语言进阶 您所在的位置:网站首页 c语言的函数可以嵌套定义吗 03.C语言进阶

03.C语言进阶

2024-05-21 18:13| 来源: 网络整理| 查看: 265

C语言之宏的使用技巧(宏嵌套/宏展开/可变参数宏) 1.前言

最近在看库代码及源代码与开源项目的时候经常会遇到一些特殊的宏用法。预处理器在源代码编译之前对其进行一些文本性质的操作。它的主要任务包括删除注释、插入被#include指令包含的文件的内容、定义和替换由#define指令定义的符号以及确定代码的部分内容是否根据一些条件编译指令进行编译。”文本性质”的操作,就是指只是简单粗暴的由一段文本替换成另外一段文本,而不考虑其中任何的语义内容(仅仅就是文本一字不漏愿意替换)。

注:为了偏于阅读和视觉解放,此篇部分宏命名采用小写范式,但工程项目开发强烈建议:大写!😏

2. 宏定义 2.1 常见形式: #define 宏名 替代文本 // 替代文本可以是列表,也可以为空(即什么都没有,仅此声明宏名而已) #define GOOD // 空宏

空宏为啥会存在?

空的宏的作用是预留下以后平台移植时的其它选项的定义,是为了移植的方便。 跟条件编译一起用:#define GOOD ; #ifdef GOOD

eg1:当替代文本为空,常用于条件编译:

#define DEBUG // 替代文本:空 ... #ifdef DEBUG ... #ifndef DEBUG ... 2.1.1 宏命名规则: 宏的名字中不允许有空格,必须遵循C变量的命名规则(只能使用字母、数字、下划线),一般习惯大写; 空宏在预编译时被替换成空字符串; 宏定义中可以包含其他宏,即嵌套宏; 预处理部分不是C语言的定义语句,所以宏定义完成之后是不带分号(😉的 2..1.2 宏的作用域:

由#define的作用域从文件中的的定义点开始,直到用#undef指令取消宏为止或者直到文件尾为止(由二者中最先满足的那个结束宏的作用域)。

2.1.3 宏的作用: 很大程度上是为了提高代码的可移植性 增强代码的可读性,例如利用宏定义常量:#define PI 3.14159 做函数功能无法完成的功能(也称之为母函数) 2.1.4 宏的几点注意: 不要在宏中使用增量和减量运算符,容易产生副作用(后述案例分析); 为防止歧义,替代列表中的参数要用括号括起来; 替代列表最外层用括号括起来,整体使用,防止替代后出现歧义(出现因运算优先级和结合性等歧义问题); 带参宏的标识符与左括号之间间不能有空格,否则会被认定为无参数宏; 宏定义中使用 = 宏定义中的末尾使用分号结尾 #define MAX(x,y) ((x) > (y) ? (x): (y)) // 替换列表,参数用括号括起来 #define IS_EVEN(n) ((n) % 2 == 0) // 判断偶数 2.2 宏的运算符 2.2.1 \

名称:宏延续符:也称之为宏的换行符;

作用:当定义的宏不能用一行表达完整时,可以用\表示下一行继续此宏的定义。

注意:换行不能切断单词,只能在空格的地方进行。

范例分析:编译器:gnu C++ DevC++5.1.5

// 为了偏于阅读,采用小写范式宏命名,工程项目开发强烈建议:大写 #include #include #include // 换行\ #define NAME "Zhang" \ "fei" \ " 你好!" int main(int argc, char **argv) { // 范例1 std::cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有