什么是“外部链接和C语言链接”

时间:2012-05-05 03:22:04

标签: c++ c

作者对以下段落中的“外部链接”和“C语言链接”的含义是什么,摘自[1]。

“extern C声明有两种不同的形式:上面使用的是extern C,而extern C {...}有大括号之间的声明。第一个(内联) )form是一个带有extern链接和C语言链接的声明;第二个只影响语言链接。以下两个声明是等价的:“

你能用这个例子进一步阐述他想要解释的内容吗?

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

2 个答案:

答案 0 :(得分:3)

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

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

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

将一个声明看作只是声明某些东西存在于某个地方而不是实际创建它。因此,定义是声明 plus 使该事物存在。

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

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

答案 1 :(得分:2)

笨拙的措辞,是的。他想要的是,

extern "C" int foo();

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

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

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

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

x将在翻译单元外显示,y则不会。