gpt4 book ai didi

c++ - 使用内部链接定义的全局外部常量变量的类

转载 作者:太空宇宙 更新时间:2023-11-04 13:56:51 25 4
gpt4 key购买 nike

我有这种情况:

// Test.h
extern const int param;
class Test
{
private:
int i;
public:
int foo();
};

// Test.cpp
#include "Test.h"
int Test::foo() { return param*10; }

// core.h
#include "Test.h"
const int param = 1; // should have internal linkage later in core.cpp
int do_stuff ();

// core.cpp
#include "core.h"
int do_stuff () { Test obj; return obj.foo(); }
int main() { return do_stuff(); }

但是没有链接器错误。链接器如何为 Test.cpp 查看 const int param,它通过 core.cpp 中定义的 core.h 具有内部链接(const 定义的默认值)?

当我像这样重写 core.h 时(更改两行):

// core.h
const int param = 1;
#include "Test.h"
int do_stuff ();

缺少 param 出现链接器错误。然后,当我这样更改它时:

// core.h
extern const int param = 1;
#include "Test.h"
int do_stuff ();

一切正常。

我想,也许在原来的情况下,在 core.cpp 中有一个类 Test 的自动内联,因此 Test.cpp 不存在,整个代码都在 core.cpp 中,所以一切正常。但为什么它要依赖于更改 core.h 中的两行?

最佳答案

您关于 const 定义的内部链接的假设并不总是正确的。请参阅标准部分 3.5 程序链接,p。 3(我引用的是 N3690):

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

  • a variable, function or function template that is explicitly declared static; or,

  • a non-volatile variable that is explicitly declared const or constexpr and neither explicitly declared extern nor previously declared to have external linkage; or

  • a data member of an anonymous union.

所以对于第一种情况,param 有外部链接,一切正常。

对于第二种情况,core.cpp中有一个内部链接的param,但是还有一个声明的param有外部链接但没有定义。

第三种情况,又是一个param

关于c++ - 使用内部链接定义的全局外部常量变量的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21065112/

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