C 预编译

  • 1. 文件包含
  • 2. 条件编译
    • 2.1 #if #ifdef #endif等
    • 2.2 #ifdef __cplusplus extern “C” { #endif
  • 3. 布局控制
  • 4. 宏替换
    • 4.1 宏定义
    • 4.2 宏函数

预处理的主要作用就是通过内建功能对一个资源进行等价替换,从而对源文件实现代码文本的替换工作,比如文本替换、文件包含、删除部分代码等,以减少重复运算过程,提高程序运行效率。最常见的预处理有:文件包含,条件编译、布局控制和宏替换4种。

1. 文件包含

#include 是一种最为常见的预处理,主要是做为文件的引用组合源程序正文。

文件包含有两种格式,分别是: #include “file” 和 #include< file >
这两格式的区别在于:

  1. 使用双引号,系统首先到当前目录下查找被包含的文件,如果没找到,再到系统指定的 " 包含文件目录 " (由用户在配置环境时设置)去找。
  2. 使用尖括号:直接到系统指定的 " 包含文件目录 " 去查找。

因此,通常使用双引号比较保险。

2. 条件编译

2.1 #if #ifdef #endif等

一般情况下,源程序中所有的代码都会参加编译,但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。

#if,#ifdef,#endif,#undef等也是比较常见条件编译的预处理,主要是进行编译时进行有选择的挑选,注释掉一些指定的代码,以达到版本控制、防止对文件重复包含的功能。

2.2 #ifdef __cplusplus extern “C” { #endif

在cpp文件中会出现如下片段:

#ifdef __cplusplus
extern “C” {#endif//代码#ifdef __cplusplus
}
#endif

它的作用在于:
对C++函数的重载处理。在C++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等。而在C中,只是简单的函数名字而已,不会加入其他的信息。也就是说:C++和C对产生的函数名字的处理是不一样的

为了在C++中尽可能的支持C,extern “C” 就是其中的一个策略。为了在C++代码中调用C的库文件,就需要用extern “C” 来告诉编译器,用C的方式来链接它们。

使用过程中,会用到#ifdef __cplusplus #endif 对头文件进行定义声明,表示的意思是:如果这是一段cpp的代码,那么加入extern “C” {" 和 " }"处理其中的代码,其中{ }内部的代码是通过extern "C"进行处理,所以在所有的头文件引用中,如果是CPP代码文件,就会自动调用g++进行编译,但是如果是C代码文件,自动调用gcc进行编译。

3. 布局控制

#progma,主要功能是为编译程序提供非常规的控制流信息。

4. 宏替换

4.1 宏定义

#define 与 typedef 的作用域区别:主要体现在函数中定义,#define在函数中定义可以作用于整个文件的定义之后部分,而在函数中定义的 typedef 类型只作用于函数中定义以下的部分。

4.2 宏函数

宏函数不是真正的函数,而是带参数的宏,只是使用方法像函数而已。
在代码中使用宏函数,预处理时会经历两次替换,第一次把宏函数替换成它后面的一串代码、表达式,第二次把宏函数中的参数替换到表达式中。

什么样的代码适合封装成宏函数?
1、代码量少,即使多次使用也不会造成代码段过度冗余。
2、调用次数,但执行次数多。
3、对返回值没有要求。

宏函数的优缺点:
优: 1、执行速度快,它不是真正的函数调用,而是代码替换,不会经历传参、跳转、返回值。
2、不会检查参数的类型,因此通用性强。

缺: 1、由于它不是真正的函数调用,而是代码替换,每使用一次,就会替换出一份代码,会造成代码冗余、编译速度慢、可执行文件变大。
2、没有返回值,最多可以有个执行结果。
3、类型检查不严格,安全性低。
4、无法进行递归调用。

C语言中预编译/预处理的使用相关推荐

  1. c语言预编译编译,c语言中预编译

    预编译又被称为预处理,是做代码文本的替换工作. 处理#开头的指令.就是为编译做预备工作的准备. 常见的预编译指令有三种 (1)#include指令 该指令指示编辑器将xxx.xxx文件的全部内容插入此 ...

  2. picf509c语言程序,樊媛媛c语言程序设计09编译预处理.pptx

    樊媛媛c语言程序设计09编译预处理 9.1 宏定义 1.不带参的宏定义用一个指定的标识符(宏名)代表一个字符串.一般形式:#define 标识符 字符串如:#define PI 3.1415926有了 ...

  3. .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析

    .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析 .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析 作者:&;nbsp来自:网络 htt ...

  4. C语言中预定义符 __FILE__, __LINE__, __FUNCTION__, __DATE__, __TIME__ 的使用演示

    本文演示了C语言中预定义符 __FILE__, __LINE__, __FUNCTION__, __DATE__, __TIME__ 的使用. 这几个预定义符的名称就没必要再介绍了,顾名思义嘛. // ...

  5. C++头文件中预编译宏的目的

    C++头文件中预编译宏的目的 eg: #ifndef _FACTORY_H_ #define _FACTORY_H_ ...... #endif //~_FACTORY_H_ 防止头文件被重复包含,导 ...

  6. FPGA设计心得(8)Verilog中的编译预处理语句

    文章目录 写在前面 正文 宏定义 文件包含 条件编译 条件生成语句问题 回顾 参考资料 交个朋友 写在前面 相关博文 博客首页 注:学习交流使用! 正文 看稍微复杂一点的IP Core以及模块等 ,都 ...

  7. 脚本没有类似C语言的预编译,开源脚本库

    开源脚本库 1 TinyC(TCC) 1.1 优点 1.1.1 速度快:直接x86汇编代码 1.1.2 标准C支持:支持标准的 ANSI C 语言,而且也支持 ISO C99 标准 1.2 缺点 1. ...

  8. c语言函数与编译预处理教学视频,C语言课程第6章 函数及编译预处理.ppt

    C语言课程第6章 函数及编译预处理 6.1模块化程序设计与函数 在设计较复杂的程序时,我们一般采用的方法是:把问题分成几个部分,每部分又可分成更细的若干小部分,逐步细化,直至分解成很容易求解的小问题. ...

  9. C语言条件编译及编译预处理阶段

    一.C语言由源代码生成的各阶段如下: C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件 其中 编译预处理阶段,读取c源程序,对其中的 ...

最新文章

  1. YML(2)yml 语法
  2. 蚂蚁金服 CTO 程立登台新加坡 Money 20/20 Asia,传递技术让世界更平等的愿景
  3. ERD2005中文版
  4. java clone方法_干货满满:Java中创建对象的五种方式详解
  5. MRCTF2020]你传你码呢
  6. PHP socket初探 --- 一些零碎细节的拾漏补缺
  7. 输入框值不能赋值成功
  8. 计算机网络---计算机网络分层结构
  9. android基础入门控件详解(4)
  10. JSP — 如何设置jsp中cookie的过期时间
  11. Spring Boot 使用Dubbo 创建Hello Wrold
  12. Matlab 求全要素生产率,如何用DEAP进行全要素生产率分析
  13. 游戏编程入门步骤,想不到吧.
  14. 华北科技计算机组成原理,华北科技学院—《计算机组成原理》设计性实验报告.doc...
  15. 思普linux安装教程,思普产品全生命周期管理系统_全生命周期管理_云市场-华为云...
  16. mysql如何设置host_如何快速修改MySQL用户的host属性
  17. Excel 2010 SQL应用066 返回数字与文本混杂的数据
  18. Matlab simulink中找不到s函数
  19. ubuntu开启远程桌面功能
  20. 2019上交CS考研经验贴

热门文章

  1. python模拟足球比赛_如何使用python从livescores获取足球比赛结果
  2. mysql没有表空间,MySQL的表空间是什么
  3. List、set、Map的底层实现原理
  4. 一文帮你分析外贸收款难问题
  5. 基于ESP32的开源定时浇花系统
  6. 儿童python编程app_Python编程狮app下载
  7. Windows企业版2019安装,和显示无法打开所需文件d:\sources\install.wim.”解决办法
  8. DSHOT600电调协议Verilog
  9. 2016暑假集训小结
  10. SSIS - 1.简介