//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
中的pi
和Constants
未命名类型。
我也有:
//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”作为两个值。为什么呢?
答案 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
进行全局变量声明,则它将成为隐式定义。