gpt4 book ai didi

c++ - 为什么我不能在一个类中有一个非整数静态 const 成员?

转载 作者:IT老高 更新时间:2023-10-28 12:10:17 26 4
gpt4 key购买 nike

我注意到 C++ 不会编译以下内容:

class No_Good {
static double const d = 1.0;
};

但是,它会很高兴地允许将 double 更改为 int、无符号或任何整数类型的变体:

class Happy_Times {
static unsigned const u = 1;
};

我的解决方案是将其更改为:

class Now_Good {
static double d() { return 1.0; }
};

并认为编译器将足够聪明,可以在必要时内联...但这让我很好奇。

为什么 C++ 设计者允许我静态 const 一个 int 或 unsigned,而不是一个 double?

编辑:我在 Windows XP 上使用 Visual Studio 7.1 (.net 2003)。

编辑2:

问题已得到解答,但为了完成,我看到的错误:

error C2864: 'd' : only const static integral data members can be initialized inside a class or struct

最佳答案

问题在于,对于整数,编译器通常不必为常量创建内存地址。它在运行时不存在,每次使用它都会内联到周围的代码中。它仍然可以决定给它一个内存位置 - 如果它的地址曾经被占用(或者如果它通过 const 引用传递给一个函数),它必须这样做。为了给它一个地址,它需要在一些翻译单元中定义。在这种情况下,您需要将声明与定义分开,否则它将在多个翻译单元中定义。

使用没有优化的 g++ (-O0),它会自动内联常量整数变量,但不是常量 double 值。在更高的优化级别(例如 -O1),它内联常量 double 。因此,以下代码在 -O1 处编译,但不在 -O0 处编译:

// File a.h
class X
{
public:
static const double d = 1.0;
};

void foo(void);

// File a.cc
#include <stdio.h>

#include "a.h"

int main(void)
{
foo();
printf("%g\n", X::d);

return 0;
}

// File b.cc
#include <stdio.h>

#include "a.h"

void foo(void)
{
printf("foo: %g\n", X::d);
}

命令行:

g++ a.cc b.cc -O0 -o a   # Linker error: ld: undefined symbols: X::d
g++ a.cc b.cc -O1 -o a # Succeeds

为了获得最大的可移植性,您应该在头文件中声明常量并在某个源文件中定义一次。没有优化,这不会影响性能,因为你没有优化,但是启用优化,这可能会影响性能,因为编译器不能再将这些常量内联到其他源文件中,除非你启用“整个程序优化” .

关于c++ - 为什么我不能在一个类中有一个非整数静态 const 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/370283/

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