为什么Numerical Recipes头文件中没有包含警戒?

时间:2016-02-18 16:28:54

标签: c++ numerical-methods pragma include-guards numerical-recipes

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

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

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

我在代码中找到的错误提示了这个问题;

错误LNK2005:“void __cdecl gaussj(类NRmatrix&)”(?gaussj @@ YAXAAV?$ NRmatrix @ N @@@ Z)已在Schmidt_V2_(Zeta)中定义.obj

错误LNK2005:已在Schmidt_V2_(Zeta).obj中定义的“void __cdecl gaussj(NRmatrix&类NRmatrix&)”(?gaussj @@ YAXAAV?$ NRmatrix @ N @@ 0 @ Z)

1 个答案:

答案 0 :(得分:2)

AFAIK没有充分的理由。在某些情况下,您可能合法地不想使用包含保护(请参阅this question),但这不是其中之一。

如果您需要在项目中的多个位置包含这些标题,则必须引入自己的警卫,如下所示:

#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版本,但可能您不再需要支持。