gpt4 book ai didi

c++ - C++中extern关键字的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:05 26 4
gpt4 key购买 nike

下面两个声明有什么区别?我认为它们是等效的,但第一个示例有效,而第二个示例无效。我的意思是它编译并运行,但位图显示代码显示空白。我还没有逐步完成它,但是我是否遗漏了一些明显的东西? GUI_BITMAP 是描述位图的简单结构。这是针对 VC++ 2005 的,但我认为它在 VC++ 2008 中也失败了。在这个问题上摸不着头脑......

示例 1:

extern "C" const GUI_BITMAP bmkeyA_cap_active;
extern "C" const GUI_BITMAP bmkeyA_cap_inactive;

示例 2:

extern "C" 
{
const GUI_BITMAP bmkeyA_cap_active;
const GUI_BITMAP bmkeyA_cap_inactive;
};

编辑:更多的探索表明第二个例子是创建结构,而第一个是指外部结构。第二个示例应该无法链接,因为在全局范围内有两个同名变量。但它没有,它向放弃的显示代码发送一个零填充结构。嗯……

编辑 2: 通过另一个编译器 (IAR) 运行相同的代码实际上无法在示例 2 上编译,并出现有关缺少默认构造函数的错误。所以我猜测“extern”关键字、结构和 C++ 有一些我不了解的微妙之处。如果 extern area 中的东西是函数,那么两个样本应该是相同的吧?

最佳答案

您的链接器可能会默默地解决您背后的重复符号。您可能会从供应商那里获得静态库,并且必须将它们与您的程序链接 - 如果您有两个这样的库并且它们都定义了一个公共(public)符号,那么解决方案是什么?链接器将解决这个问题,选择一个或另一个定义,然后让您处理后果。您如何处理应用程序的链接阶段?如果您直接链接 .o 文件而不是在链接最终应用程序之前将它们放入中间库,您可能会有更好的结果。

This page的 ARM 文档很好地描述了这个问题 - 我希望您的情况会发生类似的行为:

Multiple definitions of a symbol in different library objects are not necessarily detected. Once the linker has found a suitable definition for a symbol it stops looking for others. Assuming the object containing the duplicate symbol is not loaded for other reasons no error will occur. This is intentional and particularly useful in some situations.

编辑:更多的搜索表明这个问题是由于违反了“One Definition Rule”而引起的,因此编译器/链接器不需要通知你这个问题。这使您的问题与 this one 重复.

关于c++ - C++中extern关键字的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2527697/

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