gpt4 book ai didi

c++ - 在另一个带有命名空间的头文件中定义常量

转载 作者:行者123 更新时间:2023-11-28 02:59:02 25 4
gpt4 key购买 nike

第一个问题

//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

我收到一条错误消息,指出 Constants 类中的 epi 没有命名类型。

第二题

我还有:

//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”作为两个值。为什么?

最佳答案

第一个问题:正如编译器所说,您在定义之外遗漏了类型名称:

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

第二个问题:您已将变量声明为static,为它们提供内部链接。因此每个翻译单元中都会有一个单独的拷贝,除了包含初始化程序的那个之外,它的值为零。

选项是:

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

它们也应该是 const 以强制它们保持不变。在这种情况下,它们将默认具有内部链接,因此如果您不在 header 中初始化它们,您将需要一个显式的 extern

关于c++ - 在另一个带有命名空间的头文件中定义常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21330949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com