相关疑难解决方法(0)

如何在C++中初始化私有静态成员?

在C++中初始化私有静态数据成员的最佳方法是什么?我在头文件中尝试了这个,但它给了我奇怪的链接器错误:

class foo
{
    private:
        static int i;
};

int foo::i = 0;
Run Code Online (Sandbox Code Playgroud)

我猜这是因为我无法从课外初始化私人成员.那么最好的方法是什么?

c++ initialization static-members

492
推荐指数
11
解决办法
47万
查看次数

"const static"在C和C++中意味着什么?

const static int foo = 42;
Run Code Online (Sandbox Code Playgroud)

我在StackOverflow上的一些代码中看到了这个,我无法弄清楚它是做什么的.然后我在其他论坛上看到了一些困惑的答案.我最好的猜测是它在C中用来隐藏foo其他模块的常量.它是否正确?如果是这样,为什么有人会在C++上下文中使用它,你可以做到这一点private

c c++

111
推荐指数
7
解决办法
18万
查看次数

内联变量如何工作?

在2016年奥卢ISO C++标准会议上,一项名为Inline Variables的提案被标准委员会投票选为C++ 17.

通俗地说,什么是内联变量,它们如何工作以及它们对什么有用?如何声明,定义和使用内联变量?

c++ c++17

106
推荐指数
3
解决办法
3万
查看次数

在C++中定义全局常量

我想在C++中定义一个常量,以便在几个源文件中可见.我可以想象以下方法在头文件中定义它:

  1. #define GLOBAL_CONST_VAR 0xFF
  2. int GLOBAL_CONST_VAR = 0xFF;
  3. 一些功能可以恢复价值(例如int get_GLOBAL_CONST_VAR())
  4. enum { GLOBAL_CONST_VAR = 0xFF; }
  5. const int GLOBAL_CONST_VAR = 0xFF;
  6. extern const int GLOBAL_CONST_VAR; 并在一个源文件中 const int GLOBAL_CONST_VAR = 0xFF;

选项(1) - 绝对不是您想要使用的选项

选项(2) - 使用头文件在每个目标文件中定义变量的实例

选项(3) - 在大多数情况下,IMO过度杀戮

选项(4) - 在许多情况下可能不好,因为枚举没有具体类型(C++ 0X将增加定义类型的可能性)

所以在大多数情况下我需要在(5)和(6)之间进行选择.我的问题:

  1. 你更喜欢(5)或(6)?
  2. 为什么(5)没问题,而(2)不是?

c++

75
推荐指数
7
解决办法
9万
查看次数

混合extern和const

我可以将extern和const混合为extern const吗?如果是,const限定符是否仅在其声明的范围内强加它的统治,或者它是否应与它声明的转换单元的声明完全匹配?即extern const int i;即使实际的i不是const,反之亦然,我可以声明说吗?

c c++ scope const extern

56
推荐指数
3
解决办法
5万
查看次数

在C++标头中定义常量变量

我正在研究的程序有很多适用于所有类的常量.我想制作一个头文件"Constants.h",并能够声明所有相关的常量.然后在我的其他课程中,我可以包括#include "Constants.h.

我使用#ifndef... #define ...语法使其工作正常.但是,我更喜欢使用const int...常量的形式.我不太清楚如何.

c++ header constants

54
推荐指数
4
解决办法
8万
查看次数

在头文件中使用constexpr

我可以在头文件中有这样的定义吗?

 constexpr double PI=3.14;
Run Code Online (Sandbox Code Playgroud)

在包含在几个cpp文件中的头文件中有这个问题吗?

我担心,因为它在标准中说这个constexpr有自己的内存,把它放在头文件中,并在几个cpp文件中添加标题,在内存中生成相同值的多个副本以及其他一些令人讨厌的问题.

我正在使用C++ 11

c++ constexpr c++11

20
推荐指数
3
解决办法
7609
查看次数

constexpr变量的唯一地址

是否可以为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.ccb.cc分开并将它们链接在一起,我看到打印了两个不同的地址.如果我extern在标题中添加关键字,我会收到链接器错误duplicate symbol _foo in: a.o and b.o,我觉得有点令人惊讶,因为我认为添加extern更有可能导致编译器从另一个对象导入该符号,而不是从当前对象导出它.但似乎我对这些事情的运作方式的理解是错误的.

是否有合理的方法在一个标题中声明constexpr,这样所有翻译单元都可以在其常量表达式中使用它,并且所有翻译单元都同意该符号的地址?我希望一些额外的代码来表示这个符号实际所属的单个翻译单元,就像没有的externextern变量一样constexpr.

c++ extern memory-address constexpr c++11

11
推荐指数
2
解决办法
3429
查看次数

全局变量 - 何时使用 static、inline、extern、const 和 constexpr

有很多与 C++ 全局变量相关的问题和答案,例如:

它们都包含一些小信息片段,例如inline变量在 C++17 中具体如何工作等。其中一些还没有很好地老化,因为 C++17 通过引入inline变量从根本上改变了规则。

C++20 还引入了模块和模块链接,这再次使得 StackOverflow 上的大多数内容过时,甚至过时。

本问答旨在统一这些问题,并为读者提供考虑这些版本更改的概述。

问题

  • 何时使用staticinlineexternconstconstexpr作为全局变量?
  • 历史上答案如何变化(C++17 之前/之后,C++20 之前/之后)?
  • 答案如何根据全局变量所在的位置(标头/源/模块)而变化?

c++ constants global-variables c++-faq linkage

2
推荐指数
1
解决办法
681
查看次数