1. 四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: 以下则可行: 虽然: 也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。 用途二: 用在旧的C的代码中(具体多旧没有查),帮助struc ...
分类:
其他好文 时间:
2018-04-20 22:05:46
阅读次数:
152
(1)宏常量也称为符号常量,是指用一个标识符号来表示的常量,宏常量是由宏定义编译预处理命令来定义的,宏定义的一般形式:#define 标识符 字符串 宏定义中的标识符被称为宏名,将程序中出现的宏名替换成字符串的过程称为宏替换,宏替换时是不做任何语法检查的,因此,只有在对已经被宏展开后的源程序进行编译 ...
分类:
其他好文 时间:
2018-04-18 21:57:37
阅读次数:
170
常量折叠概念 常量折叠表面上的效果和宏替换是一样的,只是“效果上是一样的”,而两者真正的区别在于,宏是字符常量,在预编译宏替换完成后,该宏名字会消失,所有对宏的引用已经全部被替换为它所对应的值,编译器当然没有必要维护这个符号,而常量折叠发生的情况是,对常量的引用情况全部替换为该常量的值,但是,常量名 ...
分类:
编程语言 时间:
2018-04-11 15:53:18
阅读次数:
175
const和#define的利弊,从而推导const的意义;const和#define都有类似的功能,那就是定义一个“常量”;想用来替换#define定义常量这种方式。这是一种定义宏的方式。因为宏替换定义常量有一定的缺陷:不做类型检查,没有作用域限制(这样很容易被后续污染)。#include<iostream>#include<string>usingnamespacest
分类:
编程语言 时间:
2018-04-10 15:14:50
阅读次数:
225
#include <stdio.h>#define f(a,b) a##b#define g(a) #a#define h(a) g(a)int main(){ printf("%s/n",h(f(1,2))); printf("%s/n",g(f(1,2))); return 0;} 首先需要了解 ...
分类:
其他好文 时间:
2018-03-19 20:55:26
阅读次数:
150
带参数的宏替换因各种需求叠加,替换规则很怪异: 1、首先将实参替换形参,并展开宏 2、如果1步展开后,有#或者##,那么停止替换。 3、如果1步展开后,没有#或者##,且参数也是宏,那么继续替换,知道参数没有宏为止。 4、执行完1-3后,第一轮替换结束,再次扫描宏,如果外层还有宏,继续替换。 5、简 ...
分类:
其他好文 时间:
2018-02-06 21:35:11
阅读次数:
194
1、gcc xxx.c主要包含以下4部分功能: (1) 预处理:主要实现对头文件的包含以及宏替换等 (2) 编 译:主要将高级语言转换为汇编语言 (3) 汇 编:主要将汇编语言翻译成机器指令,得到目标文件 (4) 链 接:主要将目标文件和库文件进行链接,生成可执行文件 2、常见的编译选项 (1) - ...
分类:
其他好文 时间:
2018-01-29 17:40:23
阅读次数:
158
php扩展函数返回值MAKE_STD_ZVAL(zv) 宏替换过程如下: 替换之前: MAKE_STD_ZVAL(zv); --------------------------- 第1次替换: ALLOC_ZVAL(zv); INIT_PZVAL(zv); ---------------------... ...
分类:
Web程序 时间:
2018-01-13 14:17:41
阅读次数:
155
关于cjson的介绍和使用方法就不在这里介绍了,详情请查看上一篇博客cjson使用方法。 JSON的内存结构像广义表,可以认为是有层次的双向链表。 cJSON程序中的细节点如下: 大量宏替换 大量静态函数 错误处理机制 字符串处理时存在utf16转utf9,编码转换 用函数指针封装malloc,fr ...
分类:
Web程序 时间:
2017-12-31 10:55:25
阅读次数:
242
编译预处理指令 宏定义 宏定义是指将一个标识符(又称宏名)定义为一个字符串(或称替换文本)。在编译预处理时,对程序中出现的所有宏名都用相应的替换文本去替换,这被称为“宏替换”或“宏展开”。C语言中,“宏定义分为无参宏定义和带参宏定义两种。 无参宏定义 无参宏定义 带参宏定义 带参宏定义 条件编译 条 ...
分类:
其他好文 时间:
2017-12-07 21:56:30
阅读次数:
187