#ifdef #ifndef 到底怎么用?

最好有代码解释
还有,既然c++不推荐用宏,哪么用什么代替这两个预编译标记?

条件预编译
#if, #ifdef, #ifndef, #else, #elif, #endif通过这6条预编译指令可以简单控制编译器的行为,当文件被编译时,可以使用这些命令来控制一些特定的行被编译或不被编译。

#if expression如果表达式为真,命令后边的代码被编译。

#ifdef macro如果宏被使用#define 定义,命令后边的代码被编译。

#ifndef macro如果宏没有被使用#define 定义,命令后边的代码被编译。

A few side notes: #elif 命令是一种缩略形式,它和”elseif”具有同样的作用,你也可以在#if之后使用”defined”或者”!defined”来扩展功能。

下边是一个例子:

#ifdef DEBUG
cout << "This is the test version, i=" << i << endl;
#else
cout << "This is the production version!" << endl;
#endif你应该注意到,这个例子和在代码中插入/删除大量的”cout”语句相比,使调试变得更容易。

参考资料:http://cppreference.com/wiki/cn/preprocessor/preprocessor_if

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-01
4、逻辑预处理器指令:
4.1、逻辑#if指令:该指令原理与条件语句if相同,如果测试为真就执行后面的语句,如果为假则跳过后面的语句。该指令有两种用法,其一可以用#if指令测试某个符号以前是否用#define指令定义过,这是最常用的用法,其二可以用来测试某个条件表达式是否为真。
4.2、#if指令用法一:测试某个符号是否以前用#define定义过,该用法的指令如下#if defined 标识符 …. #endif 其缩写形式为#ifdef 标识符….#endif表示如果,指定的标识符已被#define定义,则中间的语句就包含在源文件中,如果该标识符还未被#define定义,则跳过#if和#endif之间的语句,该语句以#endif结束,还要注意的是标识符前的关见字是defined比define多一个字母d。
4.3、测试标识符是否不存在:其语法为#if !defined 标识符…..#endif缩写形式为#ifnedf 标识符…..#endif表示如果指定的标识符没有定义,则把#if和#endif之间的语句包含在源文件中,如果标识符已定义则跳过#if和#endif之间的代码,实标上#ifndef语句比#ifdef语句使用得更频繁,因为系统使用该语句防止头文件被多次包含,
4.4、防止头文件被包含多次的方:其方法为#ifndef HY #define HY语句#endif程序在开始遇到标识符HY时没有被定义,这时执行后面的语句,再第二次被使用时则标识符HY已经被定义,这时不会执行后面的语句,从而防止了同一头文件被包含多次的情况。这里要注意使用#define后面定义的标识符不需要值。
4.5、#if语句还可以使用逻辑运算符以测试多个值,比如#if defined HY1&&HY2….#endif当HY1与HY2都为真时才执行,同样还可以使用其他逻辑运算符。
4.6、#if指令用法二:测试某个表达式的值是否为真,其语法格式为:#if 常量表达式….#endif,注意常量表达式的求值结果应是整数常量表达式,比如#if a=2 …. #endif测试a的值是否为2,如果为2则执行#if与#endif之间的语句。
4.7、多个#if选择块:和常规的if语句一样#if也有对应的#else和#elif语句,比如#if a=3 …. #else …. #endif表示如果a=3则执行if后面且在#else前面的语句,如果为假则执行#else与#endif间的语句。#elif用来实现多个选择,该语句和常规语句的else if相似,比如#if a=1 …. #elif a=2 …. #elif a=3…. #else …. #endif表示,如果a=1则执行#if后的语句,如果a=2则执行该条件后的语句。

想了解具体的内容,去本人的文库里下载文章吧,本人文库里有多篇关于C++的专题学习笔记。本回答被提问者和网友采纳