为什么 Numerical Recipes 头文件中没有 include 守卫?

Why are there no include guards in Numerical Recipes header files?

这里是 C++ 程序员新手。

我正在使用 Numerical Recipes (V3) 源代码作为更大的调制 C++ 项目的一部分。

虽然我会尽量不深入我的问题的细节,但我很好奇为什么这些 NR 头文件不包含任何头保护?我知道这个问题对于过去使用过此代码的人来说非常具体,但看看 NR 论坛,他们似乎很不活跃...

我在代码中发现的提示此问题的错误是;

error LNK2005: "void __cdecl gaussj(class NRmatrix &)" (?gaussj@@YAXAAV?$NRmatrix@N@@@Z) 已经定义在 Schmidt_V2_(Zeta).obj

error LNK2005: "void __cdecl gaussj(class NRmatrix &,class NRmatrix &)" (?gaussj@@YAXAAV?$NRmatrix@N@@0@Z) 已经定义在 Schmidt_V2_(Zeta).obj

据我所知,没有充分的理由。在某些情况下,您可能不希望使用 include guard(参见 this question),但这不是其中之一。

如果你需要在你的项目中包含来自多个地方的那些headers,你必须引入你自己的守卫,像这样:

#include <a_normal_thing>
#include <another_normal_thing>

#ifndef SPECIAL_NONESENSE_H
#define SPECIAL_NONESENSE_H
#include <special_nonsense>
#endif

// More normal includes...

这很冗长且烦人,但它会起作用。

编辑:或者现在,使用 #pragma once 非常安全,正如 Donnie 在下面的评论中所建议的那样。这在早于 3.4 的 GCC 版本中不起作用,但您可能不再需要支持它了。