【问题标题】:One header for various variables一个标题用于各种变量
【发布时间】:2013-02-05 13:07:09
【问题描述】:

我有一个大型程序,用于对物理系统进行建模。因此,我需要定义不同的常量和宏。出于这个原因,我选择了一个头文件,我在其中定义了所有这些内容。我在项目的所有 .cpp 文件中都包含这个头文件,如果需要的话。以下是此类头文件(constants.h)的示例:

 #ifndef CONSTANTS_H
 #define CONSTANTS_H


 //global library
 #include <fstream>

 //constant
 const double PI = 3.1415926535;

 //macro
 #define exp_2(x) ((x)*(x))

 #endif

我在这里包含的库 fstream,因为我的许多 .cpp 文件都需要它。我不是专业的程序员,但我想听听基于此原理进行大型模拟的一般意见。你有什么建议吗?

【问题讨论】:

  • 使用该宏会导致意想不到的结果,例如exp_2(f()) 将调用 f 两次。请改用函数。
  • 常量没问题,宏不行。请改用内联函数。

标签: c++ header constants


【解决方案1】:

注意宏。它们看起来像函数,但语义不同,因为在您的示例中对 (x) 进行了双重评估,这可能会产生性能后果或逻辑错误。例如,使用宏 max/min/abs:

例如。 1:

// would spill extra innocent blood 
val = max(100, GetBloodSample(BS_LDL)) 

例 2:

// can unexpectedly return a number which is less than 3.     
val = max(3, schroedingerCat.GetNumPaws()) 

(定义为#define max(a,b) ((a)&gt;(b)?(a):(b))时)

改用内联函数。另外,您应该使用 Tau instead of PI))

【讨论】:

  • 内联函数最好写在constants.h还是.cpp文件中?
  • @niles_1710373:如果您在 .cpp 文件中编写 inline 函数,则它只能在该单个 .cpp 文件中使用。这就是为什么您通常将它们放在头文件中,然后可以将它们包含在每个 .cpp 文件中。
【解决方案2】:

至少你应该将你的 const 变量定义为 static 以避免在(可能的)多个包含时出现错误和编译器警告:

static const double PI = 3.1415926535;

另一种方法是在单个 .cpp 文件中定义 PI,然后在标题中 extern

【讨论】:

  • 正如在回应先前(已删除)答案时已经说过的那样,命名空间范围内的const 变量默认情况下具有内部链接。无论如何,将定义放在.cpp 文件中会阻止编译器在编译时使用该值,这可能会对大量使用 PI 的模拟产生巨大的性能影响。
猜你喜欢
  • 1970-01-01
  • 2017-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多