预处理过程时,会做以下事情或着更多:

将所有的#define删除,并且展开所有的宏定义;

处理所有条件编译指令,如#if,#ifdef等;

处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。该过程递归进行,及被包含的文件可能还包含其他文件。

删除所有的注释//;

添加行号和文件标识:每行的格式是“#   行号   文件名   标志“,其中的”行号“与”文件名“表示从它后一行开始的内容来源于

哪一个文件的哪一行,标志可以是1,2,3,4四个数字,每个数字的含义如下:

1:表示新文件的开始

2:表示从一个被包含的文件中返回

3:表示后面的内容来自系统头文件

4:表示后面的内容应当被当做一个隐式的‘extern”C“’块

include搜索文件时,会在以下几个路径搜索:

1.编译的时候指定路径
2.gcc的specs里
3.使用-I参数指定的路径
4.gcc环境变量设置(C_INCLUDE_PATH)

另外:include "fllename.h",先在当前目录寻找,然后再系统目录寻找;
        include <fllename.h>,只在系统目录寻找,找不到报错;

预处理常用命令:

#define              定义一个预处理宏
#undef               取消宏的定义
#include             包含文件命令
#include_next    与#include相似, 但它有着特殊的用途
#if                     编译预处理中的条件命令, 相当于C语法中的if语句
#ifdef                判断某个宏是否被定义, 若已定义, 执行随后的语句
#ifndef              与#ifdef相反, 判断某个宏是否未被定义
#elif                  若#if, #ifdef, #ifndef或前面的#elif条件不满足, 则执行#elif之后的语句, 相当于C语法中的else-if
#else                与#if, #ifdef, #ifndef对应, 若这些条件不满足, 则执行#else之后的语句, 相当于C语法中的else
#endif               #if, #ifdef, #ifndef这些条件命令的结束标志.
defined              与#if, #elif配合使用, 判断某个宏是否被定义
#line                 标志该语句所在的行号,如本来是第4行,你有第4行写了#line 100,它就认为是第100行(__LINE__)
#                      将宏参数替代为以参数值为内容的字符窜常量
##                    将两个相邻的标记(token)连接为一个单独的标记
#pragma           说明编译器信息
#warning          显示编译警告信息
#error              显示编译错误信息

标准C中定义了一些对象宏, 这些宏的名称以"__"开头和结尾, 并且都是大写字符. 这些预定义宏可以被#undef, 也可以被重定义.

下面列出一些标准C中常见的预定义对象宏(其中也包含gcc自己定义的一些预定义宏:
__LINE__             当前语句所在的行号, 以10进制整数标注.
__FILE__             当前源文件的文件名, 以字符串常量标注.
__DATE__            程序被编译的日期, 以"Mmm dd yyyy"格式的字符串标注.
__TIME__            程序被编译的时间, 以"hh:mm:ss"格式的字符串标注, 该时间由asctime返回.
__STDC__            如果当前编译器符合ISO标准, 那么该宏的值为1
__STDC_VERSION__    如果当前编译器符合C89, 那么它被定义为199409L, 如果符合C99, 那么被定义为199901L.
__STDC_HOSTED__        如果当前系统是"本地系统(hosted)", 那么它被定义为1. 本地系统表示当前系统拥有完整的标准C库.
gcc定义的预定义宏:
__OPTMIZE__            如果编译过程中使用了优化, 那么该宏被定义为1.
__OPTMIZE_SIZE__    同上, 但仅在优化是针对代码大小而非速度时才被定义为1.
__VERSION__            显示所用gcc的版本号.

备注:

#if 会把没有定义过的标准符视做为0, 如:#if DEBUG,如果没有定义DEBUG, 则测试#if DEBUG 会失败。

#if defined(宏)  … …,#endif

参考:

http://blog.sina.com.cn/s/blog_4bab8e7f01011gef.html

http://blog.csdn.net/a627088424/article/details/11934229

http://blog.csdn.net/shellching/article/details/4381671

C语言中预处理器的相关知识:的更多相关文章

  1. C#语言中字段和属性相关知识剖析

    针对C#中的字段和属性,很多初学者无法区分这两者之间的区别. 字段与属性比较 字段;是一种“成员变量”,一般在类的内部做数据交互使用,占用内存空间. 属性:a.是一种逻辑变量,一般跟字段一起结合起来使 ...

  2. Docs-.NET-C#-指南-语言参考-预处理器指令:#pragma checksum(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#pragma checksum(C# 参考) 1.返回顶部 1. #pragma checksum(C# 参考) 2015/0 ...

  3. Docs-.NET-C#-指南-语言参考-预处理器指令:#pragma warning(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#pragma warning(C# 参考) 1.返回顶部 1. #pragma warning(C# 参考) 2015/07/ ...

  4. Docs-.NET-C#-指南-语言参考-预处理器指令:#region(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#region(C# 参考) 1.返回顶部 1. #region(C# 参考) 2015/07/20 利用 #region,可以 ...

  5. Docs-.NET-C#-指南-语言参考-预处理器指令:#line(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#line(C# 参考) 1.返回顶部 1. #line(C# 参考) 2015/07/20 借助 #line,可修改编译器的行 ...

  6. Docs-.NET-C#-指南-语言参考-预处理器指令:#error(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#error(C# 参考) 1.返回顶部 1. #error(C# 参考) 2015/07/20 #error 可从代码中的特定 ...

  7. Docs-.NET-C#-指南-语言参考-预处理器指令:#warning(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#warning(C# 参考) 1.返回顶部 1. #warning(C# 参考) 2015/07/20 #warning 允许 ...

  8. Docs-.NET-C#-指南-语言参考-预处理器指令:#undef(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#undef(C# 参考) 1.返回顶部 1. #undef(C# 参考) 2018/06/30 #undef 允许你定义一个符 ...

  9. Docs-.NET-C#-指南-语言参考-预处理器指令:#define(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#define(C# 参考) 1.返回顶部 1. #define(C# 参考) 2018/06/30 使用 #define 来定 ...

随机推荐

  1. 使用Htmlhelper,创建文本框TextBox

    下面通过HtmlHelper帮助类,创建文本框. 首先新建一个实体类,做为下面的例子: using System; using System.Collections.Generic; using Sy ...

  2. Apache2.2配置小结.

    lamp 1.编译安装 2,日志轮循 3,优化 4,排错 4,1 vhost :NameServer 4,2 403:虚拟主机,给目录在主配置文件里添加配置 4.3 首页文件 初始化安装完成后,如果不 ...

  3. angular学习笔记(十四)-$watch(2)

    下面来看一个$watch的比较复杂的例子: 还是回到http://www.cnblogs.com/liulangmao/p/3700919.html一开始讲的购物车例子, 给它添加一个计算总价和折扣的 ...

  4. PHP源代码生成 main/config.w32.h

    PHP源代码生成 main/config.w32.h 1.下载php源代码包php-5.4.0.tar.gz,解压到D:\php-5.4.0 2.下载2个必要的包http://xiazai.jb51. ...

  5. 每日英语:No Consensus: China Debate on Women's Roles

    A woman's place is in the home. consensus:一致,舆论,合意 That was the resounding message from Jiang Xipei, ...

  6. MySQL - 1093异常 - You can't specify target table 't' for update in FROM clause

    有一个表示地区的表,表结构与数据大概如下表. ID NAME PARENT_ID 1 中国 2 广东省 1 3 广州市 2 4 荔湾区 3 5 越秀区 3 6 番禺区 3 7 小谷围街道 6 现为了查 ...

  7. Spark性能优化(1)——序列化、内存、并行度、数据存储格式、Shuffle

    序列化 背景: 在以下过程中,需要对数据进行序列化: shuffling data时需要通过网络传输数据 RDD序列化到磁盘时 性能优化点: Spark默认的序列化类型是Java序列化.Java序列化 ...

  8. Qt 的QString类的使用

    Qt的QString类提供了很方便的对字符串操作的接口. 使某个字符填满字符串,也就是说字符串里的所有字符都有等长度的ch来代替. QString::fill ( QChar ch, int size ...

  9. 使用supervisor过程中的一个问题

    我有一个php写的脚本需要常驻内存,于是使用supervisor进行管理,后来由于进程运行时间长了以后会出现假死的情况,所以就改成进程在无事可做的时候就退出,然后让supervisor再拉起来,起到重 ...

  10. Python socket聊天室程序

    http://blog.csdn.net/calling_wisdom/article/details/42524745 今天用python的socket模块实现了一个聊天室的程序 虽然功能比较简单, ...