【码极客精讲】C语言预编译指令

C语言预编译指令
摘要由CSDN通过智能技术生成

什么是预编译指令?

预编译是做些代码文本的替换工作。

处理以# 开头的指令 , 比如拷贝 #include 包含的文件代码,#define 宏定义的替换 , 条件编译等,就是为编译做的预备工作的阶段。

主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。

C 编译系统在对程序进行通常的编译之前,首先进行预处理  。

c++中条件编译相关的预编译指令,包括#define、#undef、#ifdef、#ifndef、#if、#elif、#else、#endif、defined 

 
#define     定义一个预处理宏
#undef      取消宏的定义
 
#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配合使用,判断某个宏是否被定义
以#开头的都是预编译指令,就是在正式编译之前,编译器做一些预处理的

工作。

#if 条件语句
程序段1  //如果条件语句成立,那么就编译程序段1  
#endif
程序段2//如果条件不语句成立,那么就编译程序段2
#ifndef x//先测试x是否被宏定义过  
#define   程序段1 //如果x没有被宏定义过,那么就编译程序段1   
#endif  
程序段2 //如果x已经定义过了则编译程序段2的语句,“忽视”程序段1。
#ifdef x  //先测试x是否被宏定义过  
程序段1   //如果x被宏定义过,那么就编译程序段1  
#endif 
程序段2 //如果x没有被定义过则编译程序段2的语句,“忽视”程序段1。
if就是判断语句,不是预编译指令
常见的预处理指令如下:

#空指令,无任何效果

#include包含一个源代码文件

#define定义宏

#undef取消已定义的宏

#if如果给定条件为真,则编译下面代码

#ifdef如果宏已经定义,则编译下面代码

#ifndef如果宏没有定义,则编译下面代码

#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码

#endif结束一个#if……#else条件编译块

#error停止编译并显示错误信息

(一)条件编译方法

条件编译是通过预编译指令来实现的,主要方法有:

 1、#if, #elif, #else, #endif

条件 1
 
 代码段 1#elif 条件 2   代码段 2...#elif 条件 n 代码段 n#else 代码段 n+1#endif
  即可以设置不同的条件,在编译时编译不同的代码,预编译指令中的表达式与C语言本身的表达式基本一至如逻辑运算、算术运算、位运算等均可以在预编译指令中使用。之所以能够实现条件编译是因为预编译指令是在编译之前进行处理的,通过预编译进行宏替换、条件选择代码段,然后生成最后的待编译代码,最后进行编译。

   #if的一般含义是,如果#if后面的常量表达式为true,则编译它所控制的代码,如条件1成立时就代码段1,条件1不成立再看条件2是否成立,如果条件2成立则编译代码段2,否则再依次类推判断其它条件,如果条件1-N都不成力则会编译最后的代码段n+1.

2、#ifdef, #else, #endif或#ifndef, #else, #endif

  条件编译的另一种方法是用#ifdef与#ifndef命令,它们分别表示“如果有定义”及“如果无定义”。有定义是指在编译此段代码时是否有某个宏通过 #define 指令定义的宏,#ifndef指令指找不到通过#define定义的某宏,该宏可以是在当前文件此条指令的关面定义的,也可以是在其它文件中,但在此指令之前包含到该文件中的。

#ifdef的一般形式是:

#ifdef macro_name
    代码段 1#else    代码段 2#endif或#ifdef的一般形式是:#ifndef macro_name    代码段 2#else    代码段 1#endif
这两段代码的效果是完全一样的。

3、通过宏函数defined(macro_name)

  参数为宏名(无需加""),如果该macro_name定义过则返回真,否则返回假,用该函数则可以写比较复杂的条件编译指令如:

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值