在 C++ 中使用#ifndef 和#define 是否过时了?

Is using #ifndef and #define in C++ obsolete?

最近开始学习C++,向一个日常工作用C++的朋友请教#ifndef和#define。他说没有人使用,因为如果有人编写了正确的代码,他们就不需要了。然而,在我正在阅读的书籍(对于初学者)中,被告知使用它们是一种很好的做法。

如果您想使用某些 OS 特定功能或想为不同平台编写不同代码怎么办?如果您希望能够 enable/disable 代码的某些功能怎么办?

这是预处理器和 #ifdefs、#defines 和 #endifs。

假设您希望您的代码使用某些 Windows- 和 Linux- 特定的功能:

#ifdef WINDOWS
#include <something_windows_related.h>
#else
#include <posix.h>
#endif

这在使用 OpenCL 时经常需要:

#ifdef __APPLE__
#include <OpenCL/cl.h>
#else
#include <CL/cl.h>
#endif

如果您想在需要时打开或关闭某些功能。

#ifdef HAVE_OPENCL
bool InitOpenCL(void) {
    // some code
}
#endif

所以,答案是 - 这些预处理器指令绝对可行,有时是执行某些操作的唯一方法。

好吧,正如我在评论中提到的,而不是使用

#ifndef MYHEADER_
#define MYHEADER_
#endif

大多数现代编译器提供

#pragma once

用于避免多次包含头文件的预处理器指令。

但我仍然建议使用第一种形式,因为它是便携式的。

同样简单地说 #pragma once 存在,不会使 #ifndef#define 指令完全过时,它们也用于其他用途。

解决关于 C++ 的任何困惑:

  1. c++ 有一个标准 https://isocpp.org/std/the-standard。 警告! C++ 编译器不保证支持所有标准特性。其他的可以支持一些自己的特性。
  2. 在我看来,了解 C++ coding/practice 的最佳方式是在 Boost(http://www.boost.org) 源中观察。

关于你的情况。

在写任何一行代码之前。您必须找到问题的答案:'YYY compiler have support of XXX feature or not?'

例如,您希望使用 'pragma once' 编写 C++ std11 或 std14。目标 platforms/compilers 是 OSX、Windows 和 Apple CLang、vcc。

通过 msdn 搜索,我们得到以下信息 https://msdn.microsoft.com/en-us/library/4141z1cx(v=vs.71).aspx https://msdn.microsoft.com/en-us/library/4141z1cx(v=vs.140).aspx vcc 支持 pragma 一旦从 vs 71 开始 - 更高版本。

因此,通过 google/Whosebug/etc 您可以获得有关任何编译器和功能的信息。使用找到的信息,您可以决定是否使用 std/not 标准功能。