C++中#ifdef、#endif等宏的使用

一般情况下,源程序中所有的行都参加编译。但是有时希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句,这就是“条件编译”。

为了满足条件编译可以使用#ifdef、#ifndef、#endif等宏指令。

条件编译命令最常见的形式为:

(1)如果宏定义了标识符1,则执行程序段1。

#ifdef  标识符1

//程序段1

#endif

(2)如果宏定义了标识符1,则执行程序段1;否则执行程序段2。

#ifdef  标识符1

//程序段1

#else

//程序段2

#endif

上面的“程序段”可以是语句组,也可以是命令行。“标识符”可以使表达式。#ifdef可以由#ifndef替换,定义完全相反,如(1)中#ifdef由#ifndef替换

下面具两个例子说明#ifdef、#ifndef、#endif等宏指令的使用。

例子1:

如果我们在编写程序时,调试时希望输出一些信息以便于调试,而调试完成后这些信息是不需要输出的,那么我们可以这么做:

#define  DEBUG

#ifdef  DEBUG

//调试时需要输出的信息语句

#endif

当我们调试完成后,直接把语句#define  DEBUG删掉即可,然后#ifdef DEBUG和#endif之间定义的语句便不会被执行。

例子2 :

当A 大于0输出A,A小于0输出-A

#ifdef  ISPOSITIVE

#ifdef  ISPOSITIVE

cout<<A;

#else

cout<<-A;

#endif

假设我们输入的一直是正数,则定义#ifdef ISPOSITIVE,如果输入一直是负数,则删掉定义#ifdef ISPOSITIVE即可。

总结:

条件编译可以提高C++源程序的通用性。比如例子1中如果输出信息特别多,不使用条件编译也行,但是修改程序量太大。

采用条件编译,可以减少被编译的语句,从而减少目标的长度。当条件编译段比较多时,目标程序长度可以大大减少。比如例子2如果用if语句代替,那么if语句的所有内容都需要编译,即目标程序太长,而使用条件编译则选择性编译,缩减了目标函数长度(如果语句十分长,完全体现了这种优势)。

时间: 2024-11-07 06:36:04

C++中#ifdef、#endif等宏的使用的相关文章

c语言中的#ifndef、#def、#endif等宏是什么意思

#ifndef.(或者#ifndef).#def.#endif等宏这几个宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”.有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句.  条件编译命令最常见的形式为:  #ifdef 标识符  程序段1  #else  程序段2  #endif    它的作用是:当标识符已经被定义过(一般是用#define命令

c语言中的 #ifndef、#def、#endif等宏的意思

#ifndef.(或者#ifndef).#def.#endif等宏这几个宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”.有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句.  条件编译命令最常见的形式为:   #ifdef 标识符  程序段1  #else  程序段2  #endif 它的作用是:当标识符已经被定义过(一般是用#define命令定义

C中的预编译宏定义

文章来自 http://www.uml.org.cn/c++/200902104.asp 在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前, 预处理器首先对源程序中的"宏(macro)"进行处理. C初学者可能对预处理器没什么概念, 这是情有可原的: 一般的C编译器都将预处理, 汇编, 编译, 连接过程集成到一起了. 编译预处理往往在后台运行. 在有的C编译器中, 这些过程统统由

visual c++中预定义的宏

一.主要目标 (由于visual studio通常包含很多开发环境,通常将其中c/c++的ide称为visual c++ 20xx) 整理下visual c++ 2010下预定义的宏.做一下备忘和了解,在实际编码中可以考虑使用部分宏作为判断标准. 主要参考链接:http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.100).aspx 二.vc++ 2010中预定义宏 注意本文中提及的所有预定义宏都是无参数的,并且不能重定义. 1. __FIL

swift中 类似OC的宏定义

OC 中调试打印 /** *  自定义Log */ #ifdef DEBUG #define JYLog(...)        NSLog(__VA_ARGS__) #else #define JYLog(...) #endif // swift中我写了这么一个类,进行调试输出 调用方法  Debug.Log(error) import UIKit class Debug: NSObject{ // TODO: 为调试修改 private static let debug = true cla

VC中预处理指令与宏定义详解

刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具.使用它们可以进行简单的源代码控制,版本控制,预警或者完成一些特殊的功能. 一个经典的例子 使用预处理与宏定义最经典的例子莫过于加在一个头文件中以避免头文件被两次编译.试想这种的情况,有一个文件headerfile.h 它被包含在headerfile1.h中,同时在headerfile2.h 中也被包含了,现在有一个CPP文件,implement.cpp 包含了headerfi

Erlang中的record与宏

http://www.cnblogs.com/me-sa/archive/2011/07/20/erlang0006.html 在Erlang中使用Tuple ,数据项的顺序\数量都是确定的,一旦数据项顺序调整或者增减字段,都容易出现badmatch. 同时一些常量如果硬编码到代码中,一旦数值变化,要想全部可靠的替换成新的数值是一个困难的事情. 这两种数据层面的变化,在Erlang中对应的解决方案是: record  Macro record   在代码中我们创建一个record:   -rec

C++中 #ifdef的妙用详解

本文主要介绍c语言中条件编译相关的预编译指令,包括  #define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. #define            定义一个预处理宏#undef            取消宏的定义 #if                   编译预处理中的条件命令,相当于C语法中的if语句#ifdef              判断某个宏是否被定义,若已定义,执行随后的语句#ifndef            与

内核中likely和unlikely宏定义

在内核代码中经常会看到unlikely和likely的踪影.他们实际上是定义在 linux/compiler.h 中的两个宏. #define likely(x)    __builtin_expect(!!(x), 1) #define unlikely(x)  __builtin_expect(!!(x), 0) 这里的__built_expect()函数是gcc的內建函数. 至于为什么要在内核代码中使用这两个宏,主要的目的是为了进行代码的优化,提高系统执行速度. 比如 : if (like