gpt4 book ai didi

c++ - 编译单元之间共享的全局常量对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:41 24 4
gpt4 key购买 nike

当我声明并初始化一个 const 对象时。

// ConstClass.h
class ConstClass
{
};

const ConstClass g_Const;

并且有两个 cpp 文件包含此 header 。

// Unit1.cpp
#include "ConstClass.h"
#include "stdio.h"

void PrintInUnit1( )
{
printf( "g_Const in Unit1 is %d.\r\n", &g_Const );
}

// Unit2.cpp
#include "ConstClass.h"
#include "stdio.h"

void PrintInUnit2( )
{
printf( "g_Const in Unit2 is %d.\r\n", &g_Const );
}

当我构建解决方案时,没有链接错误,如果 g_Const 是非常量基本类型,您会得到什么!

而PrintInUnit1()和PrintInUnit2()表明在两个编译单元中有两个独立的“g_Const”,地址不同,为什么?

==============

我知道如何修复它。(使用 extern 关键字声明,并在一个 cpp 文件中定义它。)

我想知道为什么我在这个示例中没有收到 redfined 链接错误。

最佳答案

https://stackoverflow.com/a/6173889/1508519

const variable at namespace scope has internal linkage. So they're basically two different variables. There is no redefinition.

3.5/3 [basic.link]:

A name having namespace scope (3.3.5) has internal linkage if it is the name of

— an object, reference, function or function template that is explicitly declared static or,

— an object or reference that is explicitly declared const and neither explicitly declared extern nor previously declared to have external linkage; or

— a data member of an anonymous union.

如果您希望它具有外部链接,请使用 extern


如其他答案所述,头文件只是粘贴在 cpp 文件中。两个 cpp 文件中包含相同的头文件,但它们是单独的翻译单元。这意味着变量的一个实例不同于另一个实例。另外,要让编译器知道您在别处定义了变量,请使用 extern 关键字。这确保只有一个实例在翻译单元之间共享。然而 extern const Test test 只是一个声明。你需要一个定义。只要在某些 cpp 文件中定义一次,在何处定义它并不重要。您可以根据需要多次声明它(方便将其放在头文件中。)

例如:

常量.h

class Test
{
};

extern const Test test;

Unit1.cpp

#include "Constant.h"
#include <iostream>

void print_one()
{ std::cout << &test << std::endl; }

单元2.cpp

#include "Constant.h"
#include <iostream>

void print_two()
{ std::cout << &test << std::endl; }

主要.cpp

extern void print_one();
extern void print_two();

int main()
{
print_one();
print_two();
}

常量.cpp

#include "Constant.h"
const Test test = Test();

生成文件

.PHONY: all
all:
g++ -std=c++11 -o test Constant.cpp Unit1.cpp Unit2.cpp main.cpp

关于c++ - 编译单元之间共享的全局常量对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20716091/

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