gpt4 book ai didi

C++ 命名空间和常量变量

转载 作者:行者123 更新时间:2023-12-05 01:04:16 29 4
gpt4 key购买 nike

我在 win10 中使用 Visual Studio 2019 将这些文件编译为单个程序

我的项目只有两个源文件:

/**** a.cpp ****/

namespace pers{
const int LEN = 5;
}

/**** b.cpp ****/

namespace pers {
const int LEN = 5;
}

int main() {
return 0;
}

可以编译成功,但是不知道为什么?我定义了两次LEN!!

所以,我删除了 const :

/**** a.cpp ****/

namespace pers{
int LEN = 5;
}

/**** b.cpp ****/

namespace pers {
int LEN = 5;
}

int main() {
return 0;
}

现在不行了!所以,我的问题是发生了什么? const 不同源文件中的变量可以定义两次或多次(意味着没有多重定义错误)。

同时,如果这样做,编译器会抛出“多定义错误”:

namespace pers {
const int LEN = 5;
const int LEN = 5; // multi-definition error

const int LEN2 = 10;
}
namespace pers {
const int LEN2 = 10; // multi-definition error
}


int main() {
const int a = 10;
const int a = 10; // multi-definition error

return 0;
}

最佳答案

让我们逐案看看发生了什么:

案例一

这里我们考虑:

a.cpp

namespace pers{
const int LEN = 5; //this LEN has internal linkage and is different from the LEN defined in b.cpp
}

b.cpp

namespace pers {
const int LEN = 5; //this LEN has internal linkage and is different from the LEN defined in a.cpp
}

int main() {
return 0;
}

It can be compiled successfully.But I dont know why?

这是因为 LEN 具有 内部链接,这意味着它的使用仅限于单个翻译单元,因此 a.cpp 中的 LEN 和b.cpp 不一样。这可以从 basic.link 看到其中指出:

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

  • a non-inline variable of non-volatile const-qualified type that is neither explicitly declared extern nor previously declared to have external linkage; or

还有,

When a name has internal linkage, the entity it denotes can be referred to by names from other scopes in the same translation unit.

(强调我的)

这意味着 a.cpp 中的 LENb.cpp 中的 LEN彼此不同,因此不存在多重定义错误。


I defined LEN twice!!

如上所述,您没有定义相同的 LEN 两次。它们彼此不同,因为它们具有命名空间范围并且是 const 限定的。

案例 2

这里我们考虑:

a.cpp

namespace pers{
int LEN = 5; //this LEN has external linkage and is the same a the LEN in b.cpp
}

b.cpp

namespace pers {
int LEN = 5; //this LEN has external linkage and is the same LEN as in a.cpp
}

int main() {
return 0;
}

在这种情况下,LEN 具有 外部链接,这意味着 a.cpp 和 b.cpp 中的 LEN 是相同的,因为您'定义相同的名称两次,您违反了 ODR。

案例 3

这里我们考虑:

namespace pers {
const int LEN = 5; //OK, define `LEN` with internal linkage for the first time
const int LEN = 5; // error because you're defining the same LEN with internal linkage for the second time in the same TU

const int LEN2 = 10;
}



int main() {
const int a = 10; //define a for the first time in this TU
const int a = 10; // error because you're defining the same a for the second time in the same TU

return 0;
}

在本例 3 中,您定义了相同的 LEN 两次,因此得到了上述错误。我们不能在同一个翻译单元中多次定义任何实体。

关于C++ 命名空间和常量变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72364705/

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