现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

C/C++条件编译的相关知识点

2012-07-07 07:32 工业·编程 ⁄ 共 1139字 ⁄ 字号 暂无评论

情况1:预处理指示符(条件指示符)ifdef:
#ifdef _XXXX
   ......
#else
   ......
#endif
用来判断一个预处理器常量是否已经被定义,以便有条件的包含程序代码。

  作用:可以很方便的开启/关闭整个程序的某项特定功能。

情况2:预处理指示符(条件指示符)ifndef

# ifndef FILE_H  

# define FILE_H

/*file.h*/

#else
    .....
 
#endif

这里的#ifndef,表示的是if not def。表示如果FILE_H常量没有被定义,则程序会初始化一个默认值,执行预编译里面的内容;
  作用:可以防止头文件的重复编译(嵌套包含).

情况3
#if 常量
...程序段1...
#else
...程序段2...
#endif

表示如果常量为真(非0),就执行程序段1,否则执行程序段2。
  作用:这种方法可以将测试代码加进来。当需要开启测试的时候,
  只要将常量变1就好了。而不要测试的时候,只要将常量变0。

有人会问:不用条件编译命令而直接用if语句也能达到要求,用条件编译命令有什么好处呢?的确,此问题完全可以不用条件编译处理,但那样做目标程序长(因为所有语句都编译),而采用条件编译,可以减少被编译的语句,从而减少目标的长度。当条件编译段比较多时,目标程序长度可以大大减少。

条件编译案例:
#include "stdafx.h" 
#include <iostream> 
using namespace std; 
 
#define NUM 0 
 
int main(int argc, char* argv[]) 

    #ifdef NUM 
 
        printf("NUM已经宏定义过了!\n"); 
 
    #else 
 
        printf("NUM还没有宏定义过!\n"); 
 
//结束预编译 
#endif 
 
 
//编译预处理语句 
#ifndef _NUM_ 
#define _NUM_ 
     
        printf("只能进行一次编译,防止重复编译!\n");    
         
//结束编译预处理 
#endif 
 
 
#if 1 
   printf("非0表示为真,执行!\n"); 
#else  
   printf("为0表示假,不执行!\n"); 
#endif 
   
 
    return 0; 
}
 

        编译C++程序时,编译器自动定义了一个预处理器名字__cplusplus,可以根据他来判断该程序是不是C++程序,以便有条件编译一些代码。另外两个比较有用的预定义名字是:__LINE__和__FILE__。前者记录文件已经被编译的行数,后则包含正在被编译的文件的名字。另外__TIME__和__DATA__表示当前时间和日期。

给我留言

留言无头像?