相关疑难解决方法(0)

内联变量如何工作?

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

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

c++ c++17

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

如何申报constexpr extern?

是否可以声明一个变量extern constexpr并在另一个文件中定义它?

我试了但是编译器给出了错误:

constexpr变量' i'的声明不是定义

在.h:

extern constexpr int i;
Run Code Online (Sandbox Code Playgroud)

在.cpp中:

constexpr int i = 10; 
Run Code Online (Sandbox Code Playgroud)

c++ extern constexpr

39
推荐指数
3
解决办法
9837
查看次数

用C++ 1z定义全局常量?

C++ 1z中声明内存有效全局常量的最佳方法是什么,它不进行内部链接,因此在所有翻译单元中使用单个副本?

尽管在许多地方已经提到过,但我们没有任何单一的"最佳方法"问题和答案,所以在这里.以下是我找到相关问题的部分地方列表.

我在找为atleast所有基本基本类型的解决方案,如int,double,char,std::string.

编辑1: 最好的方式,我的意思是"记忆效率".我知道对于内部联系,每个翻译单元都会有多个副本,因此会占用内存.除此之外,如果我们能够实现快速的执行时间和编译时间,这将是伟大的,代码的美化(容易)并不重要.此外,我知道外部链接将增加获取时间,因为处理器可能会在运行时获得缓存未命中.但最新的C++语言是否支持所有这些的最佳方法?或者可能建议支持每个案例?

注意:对于std::string全局常量,最佳方法是什么?是否存在可变性会对有任何影响常量性

c++ constants c++17

9
推荐指数
2
解决办法
2374
查看次数

为什么全局数组大小应该是整数常量?

在 C++ 中,我尝试声明某个大小的全局数组。我得到了错误:

数组绑定不是 ']' 标记之前的整数常量

但是当我在main()函数中声明一个相同类型的数组时,它工作正常。

为什么这里有不同的行为?

int y=5;
int arr[y];         //When I comment this line it works fine

int main()
{
    int x=5;
    int arr2[x];        // This line doesn't show any error.
}
Run Code Online (Sandbox Code Playgroud)

编辑:许多人认为这个问题是重复获取错误 "array bound is not an integer constant before ']' token"。但是这个问题并没有回答为什么会有不同的行为。

c++ variable-length-array

8
推荐指数
1
解决办法
472
查看次数

在C++中使全局"常量"的正确方法

通常,我定义一个真正的全局常量(比方说,pi)的方法是在头文件中放置一个extern const,并在.cpp文件中定义常量:

constants.h:

extern const pi;
Run Code Online (Sandbox Code Playgroud)

constants.cpp:

#include "constants.h"
#include <cmath>
const pi=std::acos(-1.0);
Run Code Online (Sandbox Code Playgroud)

这适用于像pi这样的真常量.但是,我正在寻找一个最佳实践来定义一个"常量",因为它将从程序运行到程序运行保持不变,但可能会根据输入文件而改变.这方面的一个例子是引力常数,它取决于所用的单位.g在输入文件中定义,我希望它是任何对象都可以使用的全局值.我总是听说使用非常量全局变量是不好的做法,因此目前我已将其存储在系统对象中,然后将其传递给它生成的所有对象.然而,随着对象数量的增长,这似乎有点笨拙且难以维护.

思考?

c++ variables

7
推荐指数
1
解决办法
3140
查看次数

如何设置全局容器(C++ 03)?

我想定义一个全局容器(C++ 03),这是我尝试过的一个示例代码,它不起作用.

#include <vector>
#include <string>
using namespace std;

vector<string> Aries;
Aries.push_back("Taurus");    // line 6

int main() {}
Run Code Online (Sandbox Code Playgroud)

编译错误:

prog.cpp:6:1: error: 'Aries' does not name a type
Run Code Online (Sandbox Code Playgroud)

我似乎可以定义一个空的全局向量,但无法填充它.看起来在C++ 03中,我也无法指定初始化器,例如:

vector<string> Aries = { "Taurus" };
Run Code Online (Sandbox Code Playgroud)

我在这里犯了错误,或者我如何解决这个问题?

我尝试在StackOverflow上搜索,看看之前是否已经回答了这个问题,但是只发现了这些帖子:C++中的全局对象,在C++定义全局常量,这对此没有帮助.

c++ containers global-variables c++03

4
推荐指数
3
解决办法
2416
查看次数

全局变量 - 何时使用 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
查看次数