gpt4 book ai didi

c++ - 在头文件中定义 `const int`时,为什么没有重复的定义错误?

转载 作者:行者123 更新时间:2023-12-03 06:57:53 41 4
gpt4 key购买 nike

抱歉,是否曾经有人问过。我搜索了互联网,但没有找到答案。
假设我有一个文件Common.h,并且A.cppB.cpp包括Common.h
如果要在const char *转换单元中使用全局Common,则必须在extern中将其设置为Common.h,并在Common.cpp中进行定义。否则,如果仅在const char * MSG = "Hello World";中定义Common.h,则在编译过程中会收到duplicate symbol错误。
但是,如果我仅使用Common.h之类的语句在const int CONSTANT = 10;中定义全局const int,则代码可以编译而不会出现重复的符号错误,并且一切正常。
我对为什么会这样感到困惑。在我看来,上面两个示例之间的唯一区别是类型,我认为这没有什么区别。为什么我得到C字符串的重复符号错误,而不是整数?
假设main.cppA.hB.hA.cppB.cpp如下所示:

// A.h
#pragma once
void f();
// A.cpp
#include "A.h"
#include "Common.h"

#include <iostream>

void f() {
std::cout << MSG << std::endl;
}
// B.h
#pragma once
void g();
// B.cpp
#include "B.h"
#include "Common.h"

#include <iostream>

void g() {
std::cout << CONSTANT << std::endl;
}
// main.cpp
#include "A.h"
#include "B.h"

int main()
{
f();
g();
}
现在,假设我们使用 g++ main.cpp A.cpp B.cpp Common.cpp -std=c++14命令进行编译。
如果我们将 Common.hCommon.cpp设置为以下内容,则编译将失败,并显示 duplicate symbol MSG错误:
// Common.h
#pragma once
const char * MSG = "Hello World";
const int CONSTANT = 10; // defined in header file
// Common.cpp
// empty
但是,这将编译:
// Common.h
#pragma once
extern const char * MSG;
const int CONSTANT = 10; // defined in header file
// Common.cpp
#include "Common.h"
const char * MSG = "Hello World";
我想知道为什么我们需要extern并将字符串的定义和声明分开,而不是int。
有人建议将C字符串类型设置为 const char * const而不是 const char *。为什么使指针const起作用?另外,在这种情况下,此解决方案与我上面提供的解决方案(我们将字符串改为extern并拆分定义/声明)之间有什么区别?为什么这两种方法都能解决编译错误,并且两种方法之间有什么区别?
我还注意到,如果我将 const int变成 int,那么我再次遇到 duplicate symbol错误。我觉得这背后的原因与上述问题的答案有关。为什么会这样呢?

最佳答案

这是C和C++的差异之一。
在C++中,const变量隐式为static,即仅对当前翻译单元可见。在C中,它是extern隐含的,因此对于整个程序都是可见的(这也是C和C++中其他非常量声明的默认值)。
这解释了您的观察。
注意:变量的const char *p声明不是const变量。这意味着它指向一个const变量(即*p不能被修改),但是p本身不是const。因此,这里的行为是不同的。 const char * const p将是一个const声明。

关于c++ - 在头文件中定义 `const int`时,为什么没有重复的定义错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63840677/

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