当前位置: 首页 > news >正文

C语言中预处理器的相关知识:

 

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

将所有的#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

相关文章:

  • java基础 - 冒泡排序,随机数算法
  • 大写中文数字-財务
  • 关于android:focusable属性
  • php基础教程(一):预备知识
  • javascript页面刷新的几种方法
  • SFB 项目经验-02-共存迁移-Lync 2013-TO-SFB 2015-规划02
  • PL/SQL常用语句
  • springMvc源码学习之:spirngMvc的拦截器使用
  • linux系统用户以及用户组管理
  • git 使用教程整理
  • cisco 1000v 使用3层模式 这次会一点了。。。
  • 如何在onCreate中获取View的高度和宽度
  • Orchard模块开发全接触6:自定义用户注册
  • webservice通过soap协议出现不能加载wsdl文件解决办法
  • Web 研发模式演变 | 搞懂历史
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Android优雅地处理按钮重复点击
  • Java比较器对数组,集合排序
  • jQuery(一)
  • JS学习笔记——闭包
  • spring boot下thymeleaf全局静态变量配置
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • SQLServer之创建显式事务
  • SSH 免密登录
  • Xmanager 远程桌面 CentOS 7
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 前端学习笔记之观察者模式
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 优化 Vue 项目编译文件大小
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #define与typedef区别
  • $L^p$ 调和函数恒为零
  • (3)STL算法之搜索
  • (C#)获取字符编码的类
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (超详细)语音信号处理之特征提取
  • (二)fiber的基本认识
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (南京观海微电子)——I3C协议介绍
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (原創) 未来三学期想要修的课 (日記)
  • (转)EOS中账户、钱包和密钥的关系
  • .form文件_SSM框架文件上传篇
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • /usr/bin/env: node: No such file or directory
  • [ linux ] linux 命令英文全称及解释
  • [16/N]论得趣
  • [4.9福建四校联考]