我想了解外部联系和内部联系及其区别.
我也想知道的意思
const默认情况下,变量内部链接,除非另有声明extern.
我正在阅读Meyers编写的"Effective C++",并且遇到了"翻译单元"一词.
有人可以给我一个解释:
1)究竟是什么
2)在使用C++编程时,我应该何时考虑使用它
3)如果它只与C++有关,或者它可以与其他编程语言一起使用
我可能已经在不知道术语的情况下使用它了....
我想在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)之间进行选择.我的问题:
不幸的是,我有点困惑constexpr,在头文件中声明的全局常量和odr.
简而言之:我们可以从这里结束
https://isocpp.org/files/papers/n4147.pdf
那
constexpr MyClass const MyClassObj () { return MyClass {}; }
constexpr char const * Hello () { return "Hello"; }
Run Code Online (Sandbox Code Playgroud)
比...好
constexpr MyClass const kMyClassObj = MyClass {};
constexpr char const * kHello = "Hello";
Run Code Online (Sandbox Code Playgroud)
如果我想"只使用"那些全局声明/定义的实体并且不想考虑我如何使用它们,那么在头文件中定义全局变量?
在C++中声明和定义全局常量的最佳方法是什么?我最感兴趣的是C++ 11标准,因为它在这方面做了很多修复.
[编辑(澄清)]:在这个问题中,"全局常量"表示在编译时在任何范围内已知的常量变量或函数.必须可以从多个翻译单元访问全局常量.它不一定是constexpr风格不变-可以是这样const std::map<int, std::string> m = { { 1, "U" }, { 5, "V" } };或const std::map<int, std::string> * mAddr() { return & m; }.在这个问题中,我没有触及优选的好的范围或常数名称.让我们把这些问题留给另一个问题.[END_EDIT]
我想知道所有不同情况的答案,所以让我们假设这T是以下之一:
typedef int T; // 1
typedef long double T; // 2
typedef std::array<char, 1> T; // 3
typedef std::array<long, 1000> T; // 4
typedef std::string T; // 5
typedef QString T; // 6
class T {
// unspecified amount of code
}; // 7
// …Run Code Online (Sandbox Code Playgroud) 通常,我定义一个真正的全局常量(比方说,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++或C++ 11中,对于以下声明//初始化,
// global scope
const int a = 1; // line 1
static const int b = 2; // line 2
constexpr int c = 3; // line 3
static constexpr int d = 4; // line 4
constexpr int e = a + b + c*d; // line 5
static constexpr int f = a - b - c*d; // line 6
Run Code Online (Sandbox Code Playgroud)
这个问题说在文件范围内,C++中第1行和第2行之间没有区别.3号线和4号线怎么样?
4号线和5号线之间是否存在差异?
5号线和6号线之间有区别吗?
我们在一系列文件中定义了这些"实用程序"常量集.问题来自TOO MANY文件包含这些全局常量文件的事实,如果我们向其中一个文件添加常量并尝试构建,它会构建整个库,这需要一个多小时.
任何人都可以为这种方法提出更好的方法吗?非常感谢.
有很多与 C++ 全局变量相关的问题和答案,例如:
它们都包含一些小信息片段,例如inline变量在 C++17 中具体如何工作等。其中一些还没有很好地老化,因为 C++17 通过引入inline变量从根本上改变了规则。
C++20 还引入了模块和模块链接,这再次使得 StackOverflow 上的大多数内容过时,甚至过时。
本问答旨在统一这些问题,并为读者提供考虑这些版本更改的概述。
static、inline、extern、const等constexpr作为全局变量?