人们普遍推荐使用
然而,
这句话的意思是:“显然,gcc -DIS_SPECIAL source.cpp是可以通过的。”
但是,也会这样。
这是错误的做法。有些 C++ 编译器会以 C 模式处理文件(由于扩展名或命令行选项),实际上执行了
该文段的翻译如下:
为什么在这种情况下人们仍然使用
显然,
我只是在讨论旗帜测试的情况。
#ifdef
进行条件编译。搜索#ifdef
可以证实它的使用非常普遍。然而,
#ifdef NAME
(或等价的#if defined(NAME)
和相关的#ifndef NAME
(以及#if !defined(NAME)
)存在严重缺陷:
header.h
#ifndef IS_SPECIAL
#error You're not special enough
#endif
source.cpp
#include "header.h"
这句话的意思是:“显然,gcc -DIS_SPECIAL source.cpp是可以通过的。”
source1.cpp
#define IS_SPECIAL 1
#include "header.h"
但是,也会这样。
source0.cpp
#define IS_SPECIAL 0
#include "header.h"
这是错误的做法。有些 C++ 编译器会以 C 模式处理文件(由于扩展名或命令行选项),实际上执行了
#define __cplusplus 0
。我曾经看到过一些东西出错的情况。#ifdef __cplusplus
extern "C" {
#endif
/* ... */
#ifdef __cplusplus
}
#endif
该文段的翻译如下:
在C模式下处理,其中extern "C"
是无效的语法,因为实际上__cplusplus
被自动定义为0
。
另一方面,所有编译器都正确地执行此操作:
#if __cplusplus
extern "C" {
#endif
/* ... */
#if __cplusplus
}
#endif
为什么在这种情况下人们仍然使用
#ifdef
?他们是不知道#if
对未定义的名称也能正常工作吗?还是说在条件编译中,#if
与#ifdef
相比存在实际的劣势?
显然,
#ifdef
确实有其有效的用途,例如为可配置参数提供默认值:#ifndef MAX_FILES
#define MAX_FILES 64
#endif
我只是在讨论旗帜测试的情况。
__cplusplus == 0
的讨论,以了解为什么这是错误的测试。或者你认为将设置从1
更改为0
不应该关闭它吗? - Ben Voigt#if
和未定义宏的部分吗?还是因为你认为答案没有实际价值?还是因为这个问题写得很糟糕,普通的C和C++程序员无法理解?如果你能提供反馈,我很乐意尝试改进它。 - Ben Voigt#define HAVE_READLINE 0
和#define HAVE_READLINE 1
会做同样的事情。 - Ben Voigt__cplusplus
,也不得在任何标准头文件中定义它。”在C模式下定义它的编译器是有问题的,因此这个特定的例子并不是支持使用#if
而不是#ifndef
的一个很强的论据。 - Iwillnotexist Idonotexist