通常,源文件中所有内容都要参加编译,但是在某些时候,可能希望源文件中某些部分在
满足某些条件的情况下才进行编译,这就是所谓的“条件编译”。条件编译非常有用,许
多学习C++的人在最开始的时候往往会忽略它,因为没有它我们的程序照样运行的很好。要
注意,对于一些小型的程序,可能条件编译的作用常常被掩盖,但是当程序的规模变大后
条件编译的作用和优势就会显现出来了。因此把握它还是非常重要的。
条件编译有以下三种形式:
1:
#ifdef 标识符
程序片段1
#else
程序片段2
#endif
上述语句的意思就是如果标识符已被#define命令定义过,则对程序片段1进行编译;否则
对程序片段2进行编译。其中,程序片段2可以为一个空的程序段,那么#else就没有什么
实际的意义了,这时可以将其省略。下面看这段示例代码。
#include <iostream>
#define DEBUG
using namespace std;
void main()
{
#ifdef DEBUG
cout << "Begin..." << endl;
#else
cout << "Cannot Begin!" << endl;
#endif
int array[10];
for(int i = 0;i < 10;i++)
{
array[i] = i;
#ifdef DEBUG
cerr << "i = " << i << endl;
cerr << "array[i] = " << array[i] << endl;
#endif
}
}
2:
#ifndef 标识符
程序片段1
#else
程序片段2
#endif
形式2和形式1的区别在于#ifdef关键字换成了#ifndef关键字,其功能是如果标识符未被
#define命令定义过,则对程序片段1进行编译;否则对程序片段2进行编译,这与形式1的
功能正好相反。
3:
#if 标识符
程序片段1
#else
程序片段2
#endif
该形式完成的功能是如果表达式的值为真,则对程序片段1进行编译;否则对程序片段2
进行编译。因此可以使程序在不同条件下完成不同的功能。
条件编译还常用于防止包含于头文件中的类或者函数被被重复定义多次。在一个程序中
多次包含某个头文件会导致类和函数的重定义问题。可以通过使用条件编译来防止该问
题的发生。下面看这段代码。
#if !defined(_POINT_H_)
#define _POINT_H_
class Point {
// .....
};
#endif
上述例子中,条件编译指示#if被用于检查程序是否定义了标识符_POINT_H_。如果没
有被定义,那么例子中余下的源码将会被处理;否则如果它已经被定义过了,那么预
处理程序就会跳过这段代码。如果程序中的数个源码文件都包含该头文件了,那么条
件编译将确保该文件的内容仅被包含一次。文件被包含的第一次就使得条件#define
_POINT_H_为真,!define(_POINT_H_)为假,所以当文件被第二次包含时,该类不会
被重复定义。对包含类定义的头文件使用条件编译是个良好的编程习惯。
C/C++条件编译
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
上一篇:Effective C++
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
C++最佳实践之工程编译
在大型c/c++工程开发中,往往会涉及多级CMakeLists.txt的调用,并且调用方式错综复杂。
文件路径 CMakeLists 编译 工程目录 -
C++/C条件编译
条件编译主要在两个地方常见:头文件(.h)&& 源文件(.cpp)先来介绍他们的作用在头文件中进行条
c++ #if #ifndef #ifdef -
C++条件编译 DEBUG
您可以只在调试时进行编译,调试开关可以使用一个宏来实现,如下所示:#ifdef DEBUG cerr <<"V
#endif #define #ifdef -
C/C++ #ifdef #else #endif 条件编译
ifdef else endif
ifdef else endif -
记录 | C++ #ifdef #endif 条件编译指令
记录 | C++ #ifdef #endif 条件编译指令
c++ #ifdef #endif 条件指令 编译指令 -
C/C++ 预编译命令
(一)基本知识 预处理器指示符以“#”号开头标识,处理这些指示符的程序叫做预处理器。 #include指示符读入指定文件的内容,它有两
#define #include 字符串