我想在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 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) 我做了2个项目,第一个用C语言,第二个用C++编写,两个项目都有相同的行为.
C项目:
header.h
int varGlobal=7;
Run Code Online (Sandbox Code Playgroud)
main.c中
#include <stdio.h>
#include <stdlib.h>
#include "header.h"
void function(int i)
{
static int a=0;
a++;
int t=i;
i=varGlobal;
varGlobal=t;
printf("Call #%d:\ni=%d\nvarGlobal=%d\n\n",a,i,varGlobal,t);
}
int main() {
function(4);
function(6);
function(12);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C++项目:
header.h
int varGlobal=7;
Run Code Online (Sandbox Code Playgroud)
main.cpp中
#include <iostream>
#include "header.h"
using namespace std;
void function(int i)
{
static int a=0;
int t=i;
a++;
i=varGlobal;
varGlobal=t;
cout<<"Call #"<<a<<":"<<endl<<"i="<<i<<endl<<"varGlobal="<<varGlobal<<endl<<endl;
}
int main() {
function(4);
function(6);
function(12);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我读到默认情况下全局变量是extern,在C++中默认是C和static ; 那么为什么C++代码有效呢?
我的意思是int …
我经历了两个问题,
这两个问题以不同的方式说明了这两件事.
问题1的答案: extern
问题2的答案: extern
我需要知道以下内容.
2.默认情况下,全局变量在范围(或)中是静态的,它等同于通过指定静态存储类来声明变量吗?
3.如果有任何c或c ++差异请澄清?
在C++ 1z中声明内存有效全局常量的最佳方法是什么,它不进行内部链接,因此在所有翻译单元中使用单个副本?
尽管在许多地方已经提到过,但我们没有任何单一的"最佳方法"问题和答案,所以在这里.以下是我找到相关问题的部分地方列表.
我在找为atleast所有基本基本类型的解决方案,如int,double,char,std::string.
编辑1: 最好的方式,我的意思是"记忆效率".我知道对于内部联系,每个翻译单元都会有多个副本,因此会占用内存.除此之外,如果我们能够实现快速的执行时间和编译时间,这将是伟大的,代码的美化(容易)并不重要.此外,我知道外部链接将增加获取时间,因为处理器可能会在运行时获得缓存未命中.但最新的C++语言是否支持所有这些的最佳方法?或者可能建议支持每个案例?
注意:对于std::string全局常量,最佳方法是什么?是否存在可变性会对有任何影响常量性?
考虑一下,在头文件中声明了全局变量(不是静态类成员!):
inline static int i{};
Run Code Online (Sandbox Code Playgroud)
对于我测试过的几个编译器来说,它是有效的构造,并且实验证明,尽管也将其声明为内联的,但它们将在不同的转换单元中创建多个不同的对象(这意味着该变量中仅一个实例必须存在于程序中)。那么,static关键字比inline在这种情况下具有更高的优先级吗?