• _LINE_ 表示正在编译的文件的行号
  • _FILE_ 表示正在编译的文件的名字
  • _DATE_ 表示编译时刻的日期字符串,例如: "25 Dec 2007"
  • _TIME_ 表示编译时刻的时间字符串,例如: "12:30:55"
  • _STDC_ 判断该文件是不是定义成标准 C 程序
  • 宏名的书写由标识符与两边各二条下划线构成
  • #define PI 3.141592654
  • const 修饰的不是常量而是 readonly 的变量,const 修饰的只读变量不能用来作为定义数组的维数, 也不能放在 case 关键字后面。
  • #define ENG_PATH_4 E:\\English\\listen_to_this\\listen_to_this_3  路径使用双 反斜杠   单\ 表示连接符

  • 宏的生命周期从#define 开始到#undef 结束

条件编译

  • 条件编译的功能使得我们可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。
  • 条件编译有三种形式

 

 文件包含

  • 文件包含是将多个源文件链接形成一个源文件进行编译,形成一个目标文件
  • #include<> 预处理到 系统规定的路径中去获得这个文件(即 C 编译系统所提供的并存放在指定的子目录下的头 文件)。找到文件后,用文件内容替换该语句
  • filename 为要包含的文件名称。双引号表示预处理应在当前目录中查找文件名为 filename 的文件,若没有找到,则按系统指定的路径信息,搜索其他目录。找到文件后,用 文件内容替换该语句。
  • 需要强调的一点是:#include 是将已存在文件的内容嵌入到当前文件中。 另外关于#include 的路径也有点要说明:include 支持相对路径,格式如 trackant(蚁迹寻
    踪)所写: .代表当前目录,..代表上层目录。

#error预处理

  • #error 预处理指令的作用是,编译程序时,只要遇到 #error 就会生成一个编译错误提 示消息,并停止编译。
  • 其语法格式为:  #error error-message
  • 注意,宏串 error-message 不用双引号包围。遇到#error 指令时,错误信息被显示,可能同时 还显示编译程序作者预先定义的其他内容。关于系统所支持的 error-message 信息,请查找 相关资料

#line处理

  • #line 的作用是改变当前行数和文件名称,它们是在编译程序中预先定义的标识符 命令的基本形式如下:
  • #line number["filename"]   其中[]内的文件名可以省略 #line 30 a.h  其中,文件名 a.h 可以省略不写。
  • 这条指令可以改变当前的行号和文件名,例如上面的这条预处理指令就可以改变当前的行号 为 30,文件名是 a.h。初看起来似乎没有什么用,不过,他还是有点用的,那就是用在编译 器的编写中,我们知道编译器对 C 源码编译过程中会产生一些中间文件,通过这条指令, 可以保证文件名是固定的,不会被这些中间文件代替,有利于进行分析。

#pragma

  • #pragma 指令可能是最复杂的了,它的作用是设定编译器的 状态或者是指示编译器完成一些特定的动作。#pragma 指令对每个编译器给出了一个方法, 在保持与 C 和 C ++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译 指示是机器或操作系统专有的,且对于每个编译器都是不同的。
  • 其格式一般为: #pragma para     其中 para 为参数,下面来看一些常用的参数。

#pragma message

  • message 参数:Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。
  • 其使用方法为:  #pragma message(“消息文本”)
  • 当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。 当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有 正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判 断自己有没有在源代码的什么地方定义了_X86 这个宏可以用下面的方法 

 

 

内存对齐

  • 利用#pragma pack()来改变编译器的默认对齐方式
  • 使用指令#pragma pack (n),编译器将按照 n 个字节对齐。
  • 使用指令#pragma pack (),编译器将取消自定义字节对齐方式。 在#pragma pack (n)和#pragma pack ()之间的代码按 n 个字节对齐。
  • 但是,成员对齐有一个重要的条件,即每个成员按自己的方式对齐.也就是说虽然指定了 按 n 字节对齐,但并不是所有的成员都是以 n 字节对齐。其对齐的规则是,每个成员按其类型 的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是 n 字节)中较小的一个对齐,即: min( n, sizeof( item )) 。并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空 字节。
  • 注意事项 

#

  • 在字符串中包含宏参数,那我们就可以使用“#”,它可以把语言符号转 化为字符串

##运算符

  • 和#运算符一样,##运算符可以用于宏函数的替换部分。这个运算符把两个语言符号组合成单个语言符号

C语言深度剖析书籍学习记录 第三章 预处理相关推荐

  1. C语言深度剖析书籍学习记录 第六章 函数

    函数的好处 1.降低复杂性:使用函数的最首要原因是为了降低程序的复杂性,可以使用函数来隐含信息,从而使你不必再考虑这些信息. 2.避免重复代码段:如果在两个不同函数中的代码很相似,这往往意味着分解工作 ...

  2. C语言深度剖析书籍学习记录 第四章 指针和数组

    p 称为指针变量,p 里存储的内存地址处的内存称为 p 所指向的内存. 指针变量 p 里存储的任何数据都将被当作地址来处理 一个基本的数据类型(包括结构体等自定义类型)加上"*" ...

  3. C语言深度剖析书籍学习记录 第七章 文件结构

  4. C语言深度剖析书籍学习记录 第五章 内存管理

    常见的内存错误 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内存. 结构体成员指针未初始化 很多初学者犯了这个错误还不知道是怎么回事.这里定义了结构体变量 stu,但是他没 想到这 ...

  5. C语言深度剖析书籍学习记录 第一章 关键字

    C语言标准定义了32个关键字 union声明联合数据类型 Union declaration - cppreference.com 维护足够的空间来置放多个数据成员中的"一种",而 ...

  6. C语言深度剖析书籍学习记录 第二章 符号

    \ 连接符号,// \  可以把下一行也注释调 编译器 删除注释时,会使用空格进行替代  

  7. 基于pbl的c语言课程设计及学习指导 答案,基于PBL的C语言课程设计及学习指导前三章答案1.0版...

    <基于PBL的C语言课程设计及学习指导前三章答案1.0版>由会员分享,可在线阅读,更多相关<基于PBL的C语言课程设计及学习指导前三章答案1.0版(67页珍藏版)>请在人人文库 ...

  8. 《C语言深度剖析》学习笔记三

    第三章 预处理 注释先于预处理指令被处理,所以无法用宏定义注释 宏定义表达式时,每个参数都加括号,避免不必要的错误 宏定义时: SUM (x) 和SUM(x)不同 使用时: SUM(x) 和SUM ( ...

  9. 《C语言深度剖析》学习笔记----C语言中的符号

    本节主要讲C语言中的各种符号,包括注释符.单引号双信号以及逻辑运算符等. 一.注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空 ...

最新文章

  1. Framebuffer原理、使用、测试系列文章
  2. 【Hexo】搭建自己的博客并到Github Pages
  3. 有关gcc,make,gdb的知识
  4. fitbit手表中文说明书_如何获取和分析Fitbit睡眠分数
  5. 试用Mono Beta 1.0
  6. SpringBoot与日志配置
  7. 路由器和iP地址的那些事
  8. 数据结构上机实践第八周项目1- 建立顺序串的算法库
  9. [Oracle] SQL*Loader 详细使用教程(5)- 典型例子
  10. 可重定位的ELF文件
  11. java 管理多线程_Java线程管理(一)多线程
  12. 报考南航计算机的专硕还是学硕呢?
  13. adobe scout cc 2015中文版下载(附使用教程)
  14. 缺陷检测相关论文阅读总结(记录自己读过的论文主要内容/Ideas)
  15. fatal error: zlib.h: No such file or directory
  16. 章节十五:项目实操:PK小游戏(3)
  17. Xcode 错误整理
  18. 你是胡萝卜,是鸡蛋,还是咖啡豆?
  19. 字节、字、bit、bite的关系
  20. 碉堡的GitHub使用方式

热门文章

  1. c++界面开发_QT开发(三)——GUI原理分析
  2. 如何干净的删除vm_如何在macOS 10.15 Catalina绕过XProtect?
  3. python自动控制库_Python最为神奇的库,可控制你的鼠标键盘自动运行!
  4. spectral安装
  5. 【转】ABP源码分析十五:ABP中的实用扩展方法
  6. 【转】如何将域中的AD数据导入SharePoint
  7. 由浅到深理解ROS(1)
  8. php调用sql数据库代码怎么写,PHP读取SQL文件并导入数据库(示例)
  9. 【CodeForces - 340D】Bubble Sort Graph (思维,nlogn最长上升子序列类问题)
  10. *【牛客 - 301哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)】小乐乐打游戏(bfs,双元bfs,思维)