伪指令,条件编译,#if,#ifdef,#ifndef,#elif,#else,#endif,defined等,以及作用:
伪指令,条件编译,#if,#ifdef,#ifndef,#elif,#else,#endif,defined等,以及作用:
使用条件编译可以控制预处理器选择不同的代码段作为编译器的输入,使源代码在不同的编译条件下产生不同的代码。
平时在代码中常见的if,else if的语句,是在程序运行时的判断语句,用来决定程序的运行方向。
条件编译伪指令是在代码编译成可执行文件时的判断语句,用来决定哪些代码被编译。
条件编译为程序的移植和调试带来了极大的方便,因为在不同平台下的c/c++代码是不同的,但语言的运行逻辑和数据结构等部分没有什么区别,只是关键字和一些API上有可能因系统不同或其他不同而带来差异,此时使用条件编译暂时或永久性的编译一段代码和阻止另一段代码的编译,就可以完成在不同平台上的移植。
条件编译的伪指令主要包括:
#if,#ifdef,#ifndef,#elif,#else,#endif,defined等。
注意:
1、每个条件编译块以#if开始,以#if开始,以#endif结束,每个#if下面必须与它下面的某一个#endif配对。
2、defined必须结合#if和#elif使用,不能单独使用。
3、条件编译块可以出现在代码的任何地方。
编程过程中需要暂时放弃编译一段代码时,就可以使用条件编译伪指令#if来屏蔽这段代码,例如:
#if 0
//此处代码被禁止编译
//此处代码被禁止编译
#endif
想要使这段代码生效,被编译,只需要把0改为任何非0值。
条件编译有预处理器处理,由于伪指令无法处理有变量参与的表达式计算,所以只能使用0,1,2这样的常量,使用时,0为假,非0为真,又称“非0即1”。
条件编译中的#if虽然不能计算表达式,但是可以进行==的判断,可以对定义的宏是否相等进行判断。
例如:
#define FLAG_DOS 2
#define FLAG_UNIX 1
#define FLAG_WIN 0
#define OS
#if OS == FLAG_DOS
//执行相应代码
#elif elif OS == FLAG_UNIX
//执行相应代码
#elif OS == FLAG_WIN
//执行相应代码
#elif else
//执行相应代码
#endif
#ifdef和#ifndef
预编译伪指令#ifdef XYZ等价于#ifdefined(XYZ),此处的XYZ称为调试宏,如果前文中曾经用#define定义过宏XYZ且没有被#undef,#ifdef XYZ就会表示条件为真,否则条件为假。
例如:
#define XYZ
...
#ifdef XYZ
func();
#endif
预编译伪指令#ifndef XYZ等价于#if!defined(XYZ),例如常见的头文件保护:
#ifndef _INCLUDE_
#define _INCLUDE_
#include <iostream>
#include "test.h"
.....
#endif
预编译伪指令#error,作用是输出与平台、环境等有关的信息
例如:
#if!defined(WIN32)
#error ERROR: Only Win32 platform support!
#endif
#ifndef _cplusplus
#error MFC requires C++ compilation(use a .cpp sffix)
#endif
当预处理器件发现应用程序没有定义WIN32或者_cplusplus时,就回吧#error后面的字符序列输出到屏幕上,然后终止,程序不会进入编译阶段。
更多推荐
所有评论(0)