【问题标题】:What is "extern linkage and with C language linkage"什么是“外部链接和与 C 语言链接”
【发布时间】:2012-05-05 03:22:03
【问题描述】:

以下段落中的“外部链接”和“C语言链接”是什么意思,摘自[1]。

“extern C 声明有两种不同形式:extern C 如上所述,extern C { ... } 声明在大括号之间。第一个(内联)形式是一个声明extern 链接和with C 语言链接;第二个只影响语言链接。因此以下两个声明是等价的:"

您能否进一步详细说明他想用这个例子解释什么?

[1]http://tldp.org/HOWTO/C++-dlopen/thesolution.html

【问题讨论】:

  • Zack 和 paxdiablo 的答案都很好。您链接到的 dlopen 文档的作者提到 extern "C" 声明可以防止名称修改;更准确地说,它选择 C ​​样式名称修饰,这取决于您的编译器可能是“无”或可能是“前加下划线”。我在该文档或下面的答案中没有提到的另一件事是“C”链接也与用于函数的调用约定有关,即放置函数的参数的位置(堆栈上的顺序等) ) 以及谁负责清理(调用者/被调用者)。

标签: c++ c


【解决方案1】:

作者所说的与这两行有关:

extern "C" int foo;
extern "C" { int bar; }

foo 是一个已声明但未定义的变量。它存在于别处。另一方面,bar 既声明了 定义了。

将声明视为只是说明某物存在于某处,但并未实际创建它。因此,定义就是声明加上使那个东西存在。

后者与int bar; 完全相同,但将使用C 链接“发布”变量。例如,函数int max (int a, int b); 可以在 C 语言链接中发布为 _max,在 C++ 语言链接中发布为 _max$$int$int(允许多个具有相同名称的函数)。

请注意,此上下文中的“发布”是函数对链接器的看法,以便您的代码可以链接到它。如果没有 C 语言链接,通常很难将 C 代码与 C++ 库链接。

【讨论】:

  • 嗯,我想我明白了。当我使用时:extern "C" type id; 我在说两件事:与“C”约定链接以及id 在其他地方有定义。但是当我使用:extern "C" { type id; } 时,我正在使用“C”约定导出id,并且我还说我在这里定义了id。对吗?
【解决方案2】:

笨拙的措辞,是的。他想表达的是,

extern "C" int foo();

一样
extern "C" { extern int foo(); }

相同
extern "C" { int foo(); }

...除了“extern int foo();”和“int foo();”在 C++ 中的文件范围内没有实际区别,所以完全可以原谅你摸不着头脑。这是一个实际有所作为的案例:

extern "C" const int x = 12;
extern "C" { const int y = 12; }

x 将在翻译单元之外可见,y 不会。

【讨论】:

  • y 是这样吗?我认为文件级别的默认链接是外部的,或者 C++ 中的 const 变量不是这种情况?
  • @paxdiablo: const 命名空间范围内的变量在 C++ 中默认具有内部链接。见 3.5p3。
  • @Ben,你是对的(当然)。引入一个新的命名空间范围(包括全局命名空间) const 没有明确的 extern 将其标记为内部链接 - 我每天都在这里学到新的东西。干杯。
猜你喜欢
  • 2017-11-23
  • 2010-12-29
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2011-04-12
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多