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

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

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

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

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

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

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

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

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

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

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

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

 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不会。