【问题标题】:Why are there no include guards in Numerical Recipes header files?为什么数字食谱头文件中没有包含保护?
【发布时间】:2016-02-18 16:28:53
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 数字食谱代码不是最高质量的,这是轻描淡写的。我也相信对代码重用有严格的限制。
  • 因为他们很顽皮。他们坚持基于 1 的阵列(由于 Fortran 端口)尤其令人讨厌。但是代码是经过试验和测试的,所以有时值得使用。
  • 除了在数值部分调试的很好,* code中的Numerical Recipies基本上是not写代码的一个例子。
  • 在我看来,只有 NR 中的代码作者才能回答当前提出的问题,除非他们积极参与 SO 并插话,否则我们只能推测他们的动机。这将使这种“基于意见”成为结束问题的常见原因。

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


【解决方案1】:

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 版本中不起作用,但您可能不再需要支持它。

【讨论】:

  • 或者您可以返回并在标题顶部输入#pragma once。不管是不是别人写的,你仍然可以改变你的副本。
猜你喜欢
  • 2015-09-17
  • 2013-11-22
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 2023-04-05
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多