关闭

(转载)C/C++条件编译的相关知识点

标签: file测试编译器c
934人阅读 评论(0) 收藏 举报
分类:

链接:

http://blog.csdn.net/ryf8805/article/details/4775515


情况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__表示当前时间和日期。


       


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:211107次
    • 积分:1727
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:11篇
    • 译文:0篇
    • 评论:10条