目录

  • 宏定义
  • 文件包含
  • 条件编译

预处理命令

C语言的预处理:在编译之前进行的处理,不进行编译。

C语言的预处理功能有:

  1. 宏定义
  2. 文件包含
  3. 条件编译

预处理命令以符号“#”开头。、

宏定义

不带参数的宏定义

宏定义又称为宏代换、宏替换,简称“宏”。
格式:

#define  标识符   文本

其中的标识符就是符号常量,也称为“宏名”。

预处理(预编译)工作也称为宏展开:将宏名替换为文本(这个文本可以是字符串、可以是代码等)。
例:

#define  PI  3.1415926

把程序中全部的标识符PI换成3.1415926

说明:
(1)宏名一般用大写。
(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义。
(3)可以用#undef命令终止宏定义的作用域。
(4)宏定义可以嵌套。

带参数的宏

常规带参数的宏

除了一般的字符串替换,还要做参数代换。

格式:

#define  宏名(参数表)  文本

例如:

#define  S(a,b)   a*b

例如执行:area=S(3,2)。

第一步被换为area=a*b。

第二步被换为area=3*2。

类似于函数调用,有一个形参和实参结合的过程。

宏参数中表达式的问题

(1)实参如果是表达式容易出问题

#define   S(r)   r*r

例如执行:area=S(a+b)。

第一步换为:area=r*r。

第二步被换为area=a+b*a+b。

编程意图实际为:area=(a+b)*(a+b)。

因此:正确的宏定义是

#define  S(r)  ((r)*(r))

因此需要注意:  

  1. 宏名和参数的括号间不能有空格。
  2. 宏替换只作替换,不做计算,不做表达式求解。
  3. 函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存。
  4. 宏的形参实参结合不存在类型,也没有类型转换。
  5. 宏展开使源程序变长,函数调用不会。
  6. 宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)。

文件包含

作用:一个文件包含另一个文件的内容。

格式:

#include  "文件名"

#include <文件名>

文件包含注意:

  1. 编译时以包含处理以后的文件为编译单位,被包含的文件是源文件的一部分。
  2. 编译以后只得到一个目标文件.obj。
  3. 被包含的文件又被称为“标题文件”或“头部文件”、“头文件”,并且常用.h作扩展名。
  4. 修改头文件后所有包含该文件的文件都要重新编译。

头文件的内容除了函数原型和宏定义外,还可定义结构体、全局变量。头文件注意要点:

  1. 一个#include命令指定一个头文件。
  2. 文件1包含文件2,文件2用到文件3,则文件3的包含命令#include应放在文件1的头部第一行。
  3. 包含可以嵌套。
  4. <文件名>称为标准方式,系统到头文件目录查找文件。
  5. "文件名"则先在当前目录查找,而后到头文件目录查找。
  6. 被包含文件中的静态全局变量不用在包含文件中声明。

示例:

使用文件包含,不需要再本文件中使用extern声明被包含进来的全局变量和函数。

条件编译


有些语句希望在条件满足时才编译。
格式一:

#ifdef 标识符
程序段1
#else
程序段2
#endif

#ifdef
程序段1
#endif

当标识符已经定义时,程序段1才参加编译。

格式二

#ifndef 标识符
#define 标识1
程序段1
#endif

如果标识符没有被定义,则重定义标识1,且执行程序段1。

格式三

#if 表达式1
程序段1
#elif 表达式2
程序段2
……
#elif 表达式n
程序段n
#else
程序段n+1
#endif

当表达式1成立时,编译程序段1,当不成立时,编译程序段2。

使用条件编译优点:可以使目标程序变小,运行时间变短。

C08 C语言预处理命令的更多相关文章

  1. 不可或缺 Windows Native (4) - C 语言: 预处理命令,输入,输出

    [源码下载] 不可或缺 Windows Native (4) - C 语言: 预处理命令,输入,输出 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 预处理命令 输入 ...

  2. C 语言入门第八章--C语言预处理命令

    例如:#include ,这种以#号开头的命令称为预处理命令. ===C语言宏定义(#define的用法)==== #define 叫做宏定义命令,它也是C语言预处理命令的一种.所谓宏定义,就是用一个 ...

  3. C语言预处理命令总结大全

    C程序的源代码中可包括各种编译指令,这些指令称为预处理命令.虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境.本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性.ANS ...

  4. C语言预处理命令详解

    一  前言 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置. 预处理是C语言的一个重要功能 ...

  5. C语言预处理命令总结大全 :宏定义

    C程序的源代码中可包括各种编译指令,这些指令称为预处理命令.虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境.本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性.ANS ...

  6. [转]C语言预处理命令详解

    转载:https://www.cnblogs.com/clover-toeic/p/3851102.html 一  前言 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的 ...

  7. (61)C语言预处理命令详解

    一  前言 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置. 预处理是C语言的一个重要功能 ...

  8. C/C++编程笔记:C语言预处理命令是什么?不要以为你直接写#就行!

    很多小伙伴在自己写代码的时候,已经多次使用过#include命令.使用库函数之前,应该用#include引入对应的头文件.其实这种以#号开头的命令称为预处理命令. C语言源文件要经过编译.链接才能生成 ...

  9. C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)

    转自:http://www.kuqin.com/language/20090806/66164.html 预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器.可见预处理过程先于编译器 ...

随机推荐

  1. js 实现发布订阅模式

    /* Pubsub */ function Pubsub(){ //存放事件和对应的处理方法 this.handles = {}; } Pubsub.prototype = { //传入事件类型typ ...

  2. ue4 retarge记录

    动画重定位(相同骨骼) https://docs.unrealengine.com/latest/CHN/Engine/Animation/AnimationRetargeting/index.htm ...

  3. Ajax遇到的那些坑

    提前说明:这里我用的是Windows系统,所以解决问题的方法也是仅限Windows系统,浏览器使用Chrome 第一个坑:Access to XMLHttpRequest at 'file:///C: ...

  4. 分布式集群环境下,如何实现session共享一(应用场景)

    在web应用中,由于http的请求响应式,无状态.要记录用户相关的状态信息,比如电商网站的购物车,比如用户是否登录等,都需要使用session.我们知道session是由servlet容器创建和管理, ...

  5. 黑马旅游网 ajax实现html页面共享

  6. JavaScript进阶 - 第8章 浏览器对象

    第8章 浏览器对象 8-1 window对象 window对象是BOM的核心,window对象指当前的浏览器窗口. window对象方法:

  7. JavaScript进阶 - 第5章 小程序,大作用(函数)

    5-1什么是函数 函数的作用,可以写一次代码,然后反复地重用这个代码. 如:我们要完成多组数和的功能. var sum;   sum = 3+2; alert(sum);   sum=7+8 ; al ...

  8. C# Func与Action总结

    Action:无参数无返回值委托. Action<T>:泛型委托,无返回值,根据输入参数的个数不同有十六个重载. Func< out T>:无输入参数,有返回值. Func&l ...

  9. Django-Rest-Framework的权限和频率

    Django-Rest-Framework的权限和频率 restful framework DRF的权限 权限是什么 权限到底是是干什么用的 比如,我们申请博客的时候,一定要向管理员申请,也就是说管理 ...

  10. 基于apache httpclient的常用接口调用方法

    现在的接口开发,大部分是基于http的请求和处理,现在整理了一份常用的调用方式工具类 package com.xh.oms.common.util; import java.io.BufferedRe ...