我最近开始学习C ++,并且每天都会问一位使用C ++的朋友#ifndef和#define。他说,没有人使用,因为如果有人写了正确的代码,他们就不是必须的了。然而,在书中(对于初学者)我正在阅读它被告知使用它们是一个好习惯。
答案 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 ++的任何疑惑:
关于你的案子。
在编写任何代码行之前。您必须在问题上找到答案:&#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
指令整体过时,这些指令也用于其他内容。