在C ++中使用#ifndef和#define已经过时了吗?

时间:2016-03-28 11:54:14

标签: c++ include

我最近开始学习C ++,并且每天都会问一位使用C ++的朋友#ifndef和#define。他说,没有人使用,因为如果有人写了正确的代码,他们就不是必须的了。然而,在书中(对于初学者)我正在阅读它被告知使用它们是一个好习惯。

3 个答案:

答案 0 :(得分:4)

如果您想使用某些特定于操作系统的功能或想要为不同平台编写不同的代码,该怎么办?如果您希望能够启用/禁用代码的某些功能,该怎么办?

以下是预处理器和#ifdef s,#define#endif s。

假设您希望代码能够使用某些特定于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

所以,答案是 - 这些预处理器指令绝对可以,有时候是做某些事情的唯一方法。

答案 1 :(得分:1)

解决有关C ++的任何疑惑:

  1. c ++有一个标准https://isocpp.org/std/the-standard。 警告! C ++编译器不支持所有std功能。其他人可以支持一些自己的功能。
  2. 在我看来,了解C ++编码/练习的最佳方法是观察Boost(http://www.boost.org)来源。
  3. 关于你的案子。

    在编写任何代码行之前。您必须在问题上找到答案:&#39; YYY编译器是否支持XXX功能?&#39;

    例如,您希望编写C ++ std11或std14并使用&#39; pragma一次&#39;。目标平台/编译器是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 / stackoverflow / etc,您可以获得有关任何编译器和功能的信息。使用找到的信息,您可以决定是否使用std / not std功能。

答案 2 :(得分:0)

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

#ifndef MYHEADER_
#define MYHEADER_
#endif

大多数现代编译器提供

#pragma once

预处理程序指令,以避免多次包含头文件。

但是我仍然会建议第一种形式,因为它是可移植的。

同样只是#pragma once存在,不会使#ifndef#define指令整体过时,这些指令也用于其他内容。

相关问题