使用命名空间在另一个头文件中定义常量

时间:2014-01-24 11:01:24

标签: c++

第一个问题

//Constants.hh
namespace Constants{
    static double pi;
    static double e;
    // ...
};

//Constants.cc
#include "Constants.hh"
Constants::pi = 3.1415;
Constants::e = 2.72;
// ..

如果我使用:g++ Constants.cc

进行编译

我收到一条错误消息,指出类e中的piConstants未命名类型。

Secondo问题

我也有:

//Angle.hh
class Angle {
public:
static double piatto;
static double retto;
static double giro;
// ...
};

//Angle.cc
#include "Angle.hh"
#include "Constants.hh"
double Angle::retto = Constants::pi / 2;
double Angle::piatto = Constants::pi;
double Angle::giro = Constants::pi * 2;
// ...

主要是:

#include "Angle.hh"
#include "Constants.hh"
#include <iostream>

int main()
{
    std::cout << Constants::pi << "\n\n";
    std::cout << std::endl << Angle::retto << "\n\n";

    return 0;
}

编译没问题,但是当我运行它时,它会输出“0”和“0”作为两个值。为什么呢?

3 个答案:

答案 0 :(得分:2)

第一个问题:正如编译器所说,你从定义中留下了类型名称:

double Constants::pi = 3.1415;
^^^^^^

第二个问题:你已经声明了变量static,给它们内部联系。因此,每个翻译单元中都会有一个单独的副本,除了包含初始化程序的单词外,其值为零。

选项包括:

  • 在标题中初始化它们,而不是单独的源文件,因此它们在所有翻译单元中具有相同的值;
  • 删除static(或者如果您愿意,请将其替换为extern),为他们提供外部链接。

他们也应该const来强制执行他们的稳定性。在这种情况下,默认情况下它们将具有内部链接,因此如果您不在标题中初始化它们,则需要显式extern

答案 1 :(得分:0)

使用

double Constants::pi = 3.1415;
double Constants::e = 2.72;

答案 2 :(得分:0)

如果不使用extern进行全局变量声明,则它将成为隐式定义。