预处理指令(条件编译和宏定义)

原创 2018年04月16日 15:37:48

c语言的预处理指令包含以下三种:
(1)宏定义
(2)条件编译
(3)文件包含

## 宏定义 ##

  • 不带参数的宏定义
    格式为:#define 标识符 字符串,就是用一个指定的标识符来代替字符串。宏名习惯上用大写字母表示。宏定义只是简单的字符替换因此在使用宏定义时,要注意是否需要在宏定义中或者实参处加括号。宏置换是在预处理阶段进行的。
    宏定义不是c语句,不必在行末加分号,如果加了分号则会连分号一起进行置换,#define指令出现在程序中函数的外边,宏名的有效范围为从该指令起到本源文件结束。通常,#define指令写在文件开头,函数之前,作为文件的一部分,在整个文件范围内有效。可以使用#undef 指令终止宏定义的作用域。例如:
#define G 1000
int main()
{

}
#undef G  //表示G的作用范围到此结束。
f1()
{

}

使用宏后,当需要改变某一个常量时,只要改变宏定义就可以,比如,数组大小可以用以下语句声明:
#define array_size 100
int array[array_szie];

当需要改变数组大小时只需要修改宏定义就行了。
在进行宏定义时,可以引用已定义的宏名,例如:
#define PI 3.14
#define S PI*r*r

  • 带参数的宏定义
    定义一般形式为:#define 宏名() 字符串,不是进行简单的字符替换,还要进行参数替换,字符串中包含在括号中指定的参数,比如:#define S(a,b) a*b
    置换规则:在程序中如果有带实参的宏(如S(3,2),S(x,y)),则按#define指令行中指定的字符串从左到右进行置换,如果在串中遇到宏的形参,则将程序与句中相应的实参代替形参。如果宏定义中的字符串中的字符不是参数字符,则保留。在定义宏时,在宏名与带参数的括号之间不应该加空格,否则将空格以后的字符串都作为替代字符串的一部分。
    #define PI 3.14 #define S(r) PI*r*r,用带参数的宏来求圆面积。

    用带参数的宏可以一次得到多个结果,比如;

#define CIRCLE(R,S,L,V) L=2*PI*R;S=PI*R*R;V=4.0/3.0*PI*R*R*R;
一条宏定义就可以求出圆面积、周长、球体积。

##文件包含 ##
就是一个源文件可以将另一个源文件的全部内容包含进来,即将另外的文件内容包含到本文件之中,插入到当前位置。

##条件编译 ##
有时希望程序中的一部分内容只在满足一定条件时才编译,也就是对这一部分内容指定编译的条件,这就是条件编译。

#ifdef 标识符     若指定的标识符已经被#define指令定义过,则在程序编译
  程序段1         阶段对程序段1进行编译,否则编译程序段2。其中#else
#else            分可以没有,这里的“程序段”可以是语句组也可以是指令行
   程序段2        
#endif     


#ifndef 标识符    若指定的标识符未被定义过,则编译程序段1;否则编译程序
   程序段12
#else
   程序段2
#endif      


#if 表达式        若指定的表达式值为真就编译程序段1;否则编译程序段2。 
  程序段 1
#else
  程序段2
#endif    

C/C++编译预处理:宏定义指令、文件包含指令、条件编译指令和特殊符号处理

从源代码生成可执行文件的各个阶段为: C源程序(.c)->编译预处理(.i)->编译(.s)->优化程序->汇编程序(.o)->链接程序->可执行文件(.exe)   其中 编译预处理阶段,预处理...
  • u012209626
  • u012209626
  • 2015-08-17 21:42:10
  • 1902

宏定义与条件编译的用处

#define     定义宏     #undef      取消已定义的宏     宏定义常量与命令可以避免幻数 在宏定义命名时候应该尽量清楚表明其用途。 函数型宏定义的有点:尽管其和真...
  • du7793202641
  • du7793202641
  • 2016-11-25 22:39:32
  • 846

预处理指令—宏定义,条件编译,文件包含

1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 2.为了区分预处理...
  • A88410518
  • A88410518
  • 2015-04-19 15:21:40
  • 643

使用宏定义进行条件编译

main.cpp #include using namespace std; int main() { #ifdef PRINT     cout #endif     cou...
  • lichen18848950451
  • lichen18848950451
  • 2017-03-08 12:43:14
  • 135

C 预处理指令 宏定义 条件编译

预处理指令 宏定义
  • Ericios
  • Ericios
  • 2015-05-05 14:57:30
  • 460

条件编译/条件宏定义

  • diyouhuo
  • diyouhuo
  • 2009-12-19 11:16:00
  • 5620

C语言之关键字、宏定义、条件编译

一 全局变量和局部变量 变量作用域:变量的可用范围按照作用域的不同,变量可以分为:局部变量和全局变量 局部变量:定义在函数内部的变量以及函数的形参称为局部变量 作用域:从定义哪一行开始直到与其所在的代...
  • ab20514
  • ab20514
  • 2015-10-02 16:30:59
  • 1885

C语言详解(6)宏定义和条件编译

宏定义和条件编译    关于C语言详解系列blog的目录:http://blog.csdn.net/snake_lp/article/details/78630717   一、概述 宏定义是...
  • snake_lp
  • snake_lp
  • 2017-12-02 21:54:41
  • 243

Makefile中用宏定义进行条件编译(gcc -D)/在Makefile中进行宏定义-D

在源代码里面如果这样是定义的: #ifdef   MACRONAME //可选代码 #endif 那在makefile里面 gcc   -D   MACRONAME=MACRODEF 或者...
  • huangshanchun
  • huangshanchun
  • 2015-01-12 16:37:29
  • 1556

C语言基础:C语言宏定义(3) - 条件编译

上一节我们讲解了带参数和不带参数的宏定义, 这次我们来讲解条件编译, 什么是条件编译呢? 我们来看看吧 下面我们来看看例子: #include int main() { int...
  • qq350116542
  • qq350116542
  • 2015-01-10 21:34:21
  • 517
收藏助手
不良信息举报
您举报文章:预处理指令(条件编译和宏定义)
举报原因:
原因补充:

(最多只允许输入30个字)