在C++中初始化私有静态数据成员的最佳方法是什么?我在头文件中尝试了这个,但它给了我奇怪的链接器错误:
class foo
{
private:
static int i;
};
int foo::i = 0;
Run Code Online (Sandbox Code Playgroud)
我猜这是因为我无法从课外初始化私人成员.那么最好的方法是什么?
const static int foo = 42;
Run Code Online (Sandbox Code Playgroud)
我在StackOverflow上的一些代码中看到了这个,我无法弄清楚它是做什么的.然后我在其他论坛上看到了一些困惑的答案.我最好的猜测是它在C中用来隐藏foo其他模块的常量.它是否正确?如果是这样,为什么有人会在C++上下文中使用它,你可以做到这一点private?
在2016年奥卢ISO C++标准会议上,一项名为Inline Variables的提案被标准委员会投票选为C++ 17.
通俗地说,什么是内联变量,它们如何工作以及它们对什么有用?如何声明,定义和使用内联变量?
我想在C++中定义一个常量,以便在几个源文件中可见.我可以想象以下方法在头文件中定义它:
#define GLOBAL_CONST_VAR 0xFFint GLOBAL_CONST_VAR = 0xFF;int get_GLOBAL_CONST_VAR())enum { GLOBAL_CONST_VAR = 0xFF; }const int GLOBAL_CONST_VAR = 0xFF;extern const int GLOBAL_CONST_VAR;
并在一个源文件中 const int GLOBAL_CONST_VAR = 0xFF;选项(1) - 绝对不是您想要使用的选项
选项(2) - 使用头文件在每个目标文件中定义变量的实例
选项(3) - 在大多数情况下,IMO过度杀戮
选项(4) - 在许多情况下可能不好,因为枚举没有具体类型(C++ 0X将增加定义类型的可能性)
所以在大多数情况下我需要在(5)和(6)之间进行选择.我的问题:
我可以将extern和const混合为extern const吗?如果是,const限定符是否仅在其声明的范围内强加它的统治,或者它是否应与它声明的转换单元的声明完全匹配?即extern const int i;即使实际的i不是const,反之亦然,我可以声明说吗?
我正在研究的程序有很多适用于所有类的常量.我想制作一个头文件"Constants.h",并能够声明所有相关的常量.然后在我的其他课程中,我可以包括#include "Constants.h.
我使用#ifndef... #define ...语法使其工作正常.但是,我更喜欢使用const int...常量的形式.我不太清楚如何.
我可以在头文件中有这样的定义吗?
constexpr double PI=3.14;
Run Code Online (Sandbox Code Playgroud)
在包含在几个cpp文件中的头文件中有这个问题吗?
我担心,因为它在标准中说这个constexpr有自己的内存,把它放在头文件中,并在几个cpp文件中添加标题,在内存中生成相同值的多个副本以及其他一些令人讨厌的问题.
我正在使用C++ 11
是否可以为constexpr变量分配唯一的地址,即对于变量可用的所有翻译单元(通常通过标题)都是相同的?请考虑以下示例:
// foo.hh
#include <iostream>
constexpr int foo = 42;
// a.cc
#include "foo.hh"
void a(void) { std::cout << "a: " << &foo << std::endl; }
// b.cc
#include "foo.hh"
extern void a(void);
int main(int argc, char** argv) {
a();
std::cout << "b: " << &foo << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
使用gcc 4.7 编译a.cc和b.cc分开并将它们链接在一起,我看到打印了两个不同的地址.如果我extern在标题中添加关键字,我会收到链接器错误duplicate symbol _foo in: a.o and b.o,我觉得有点令人惊讶,因为我认为添加extern更有可能导致编译器从另一个对象导入该符号,而不是从当前对象导出它.但似乎我对这些事情的运作方式的理解是错误的.
是否有合理的方法在一个标题中声明constexpr,这样所有翻译单元都可以在其常量表达式中使用它,并且所有翻译单元都同意该符号的地址?我希望一些额外的代码来表示这个符号实际所属的单个翻译单元,就像没有的extern非extern变量一样constexpr.
有很多与 C++ 全局变量相关的问题和答案,例如:
它们都包含一些小信息片段,例如inline变量在 C++17 中具体如何工作等。其中一些还没有很好地老化,因为 C++17 通过引入inline变量从根本上改变了规则。
C++20 还引入了模块和模块链接,这再次使得 StackOverflow 上的大多数内容过时,甚至过时。
本问答旨在统一这些问题,并为读者提供考虑这些版本更改的概述。
static、inline、extern、const等constexpr作为全局变量?