在Objective-C语言源程序中,允许用一个标识符来表示一个字符串,称为宏,被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去替换,这称为宏替换或宏展开。宏定义是由源程序中的宏定义命令完成的,宏替换是由预处理程序自动完成的。在Objective-C语言中, ...
分类:
系统相关 时间:
2019-04-11 14:29:05
阅读次数:
197
1. gcc -E 预处理 头文件展开 宏替换 2. gcc -S : 生成汇编指令 3. ...
分类:
系统相关 时间:
2019-03-18 23:55:01
阅读次数:
275
1.编译工具链 预处理器--》头文件展开,宏替换-,去掉注释--》gcc -E hello.c -o hello.i 编译器--》c文件编程汇编文件 gcc -S hello.i -o hello.s 汇编器--》汇编文件变成二进制文件 gcc -c hello.s -o hello.o 链接器-- ...
分类:
其他好文 时间:
2018-12-30 22:13:10
阅读次数:
262
目录 宏定义 文件包含 条件编译 预处理命令 C语言的预处理:在编译之前进行的处理,不进行编译。 C语言的预处理功能有: 预处理命令以符号“#”开头。、 宏定义 不带参数的宏定义 宏定义又称为宏代换、宏替换,简称“宏”。格式: 其中的标识符就是符号常量,也称为“宏名”。 预处理(预编译)工作也称为宏 ...
分类:
编程语言 时间:
2018-12-26 11:41:03
阅读次数:
226
比如 #define NUM 3; 注意末尾有一个分号 printf("%d",NUM); 宏替换的时候会变成这样 printf("%d",NUM;); 会多出一个分号,这样会提示语法错误。 那怎么改呢? 可以改成#define NUM 5); printf("%d",NUM 这样编译的时候会把NU ...
分类:
其他好文 时间:
2018-10-27 01:31:19
阅读次数:
833
内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。 内联函数使用注意 ...
分类:
其他好文 时间:
2018-08-15 20:32:30
阅读次数:
115
easylogging++日志库流式日志的写入,依赖于el::base::Writer类的析构,以debug日志为例:具体代码如下: 宏替换之后就是调用了Writer类的一个构造函数和一个construct()成员函数,等同于下面代码: 单独调用一个构造函数的话,会产生一个临时对象,在语句结束后,这 ...
分类:
其他好文 时间:
2018-06-08 19:32:55
阅读次数:
714
很郁闷碰到了一个考宏扩展的例子: #define DOUBLE(x) (x+x) i = 8 * DOUBLE(8); 让求解i的值,我个人认为值应该是128.但是面试官说不对,感觉很怪异,然后我在一个VS10的工程里测试了下,发下: 结果是对的啊?到底出问题在哪里呢,我想面试官应该想考我们宏替换的 ...
分类:
其他好文 时间:
2018-05-25 22:52:15
阅读次数:
204
typedef的总结,以下是引用的内容(红色部分是我自己写的内容)。 用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量; 以下则可行: ty ...
分类:
其他好文 时间:
2018-05-16 23:56:37
阅读次数:
179
1.gcc 的工作流程 预处理(选项:E,调用<预处理器cpp>完成预处理) 宏替换 头文件展开 注视去掉 .c -> .i 编译(选项:S,也只有这一步是gcc自己完成的) .i -> .s 汇编(选项:c,调用<汇编器as>) .s -> .o 二进制文件 链接(调用<链接器ld>) .o -> ...
分类:
其他好文 时间:
2018-05-12 02:51:28
阅读次数:
149