gpt4 book ai didi

c++ - constexpr 和静态 constexpr 全局变量的区别

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

在 C++11 标准中,constexprstatic constexpr 全局变量在头文件中定义有什么区别?更具体地说,当多个翻译单元包含相同的 header 时,哪个声明(如果有)可以保证在翻译单元中定义相同的变量?

例如,

cexpr.h:

#ifndef CEXPR_H
#define CEXPR_H

constexpr int cint = 1;
static constexpr int scint = 1;

#endif

a.cpp:

#include "cexpr.h"

b.cpp:

#include "cexpr.h"

最佳答案

在您当前的示例中没有区别:在变量声明中,constexpr 意味着 const,并且命名空间范围内的 const 变量默认具有内部链接(因此添加 static 不会改变任何东西)。

在 C++14 中,您不能将变量声明为 constexpr 并使其具有外部链接,除非您只在一个翻译单元中执行此操作。原因是 constexpr 变量需要一个初始化器,而带有初始化器的声明就是一个定义,你必须只有一个定义。

然而,你可以做的是使用一个普通的整数常量,你可以将它声明(不定义)为extern,并在定义它的翻译单元中它甚至可以用作常量表达式:

lib.h:

extern const int a;

lib.cpp:

#include "lib.h"

const int a = 10;

int b[a] = {1, 2, 3}; // OK in this translation unit

在 C++17 中,有一个新功能“内联变量”可以让你说:

inline constexpr int a = 10;

这是一个可以重复出现的“内联定义”,每个定义都定义了相同的实体(就像语言中所有其他的“内联”实体一样)。

关于c++ - constexpr 和静态 constexpr 全局变量的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45987571/

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