以下段落中的“外部链接”和“C语言链接”是什么意思,摘自[1]。
C
“extern声明有两种不同的形式:C
上面使用的 extern,以及C
带有大括号之间的声明的 extern { ... }。第一种(内联)形式是具有外部链接和 C 语言链接的声明;第二种仅影响语言链接。因此,以下两个声明是等价的:
你能进一步详细说明他试图用这个例子解释什么吗?
以下段落中的“外部链接”和“C语言链接”是什么意思,摘自[1]。
C
“extern声明有两种不同的形式:C
上面使用的 extern,以及C
带有大括号之间的声明的 extern { ... }。第一种(内联)形式是具有外部链接和 C 语言链接的声明;第二种仅影响语言链接。因此,以下两个声明是等价的:
你能进一步详细说明他试图用这个例子解释什么吗?
作者所说的与这两行有关:
extern "C" int foo;
extern "C" { int bar; }
foo
是已声明但未定义的变量。它存在于别处。另一方面,bar
既是声明的又是定义的。
将声明视为只是说明某物存在于某处,但并未实际创建它。因此,定义是声明加上使该事物存在。
后者与 C 链接完全相同,int bar;
但将“发布”变量。例如,一个函数int max (int a, int b);
可以_max
以 C 语言链接和_max$$int$int
C++ 语言链接的形式发布(以允许多个具有相同名称的函数)。
请注意,此上下文中的“发布”是函数在链接器中的外观,以便您的代码可以链接到它。如果没有 C 语言链接,通常很难将 C 代码与 C++ 库链接。
笨拙的措辞,是的。他想要达到的是,
extern "C" int foo();
是相同的
extern "C" { extern int foo(); }
但不一样
extern "C" { int foo(); }
extern int foo();
...除了在 C++ 中的文件范围内“ ”和“ ”之间没有实际区别int foo();
,因此完全可以原谅你摸不着头脑。这是一个实际上有所作为的案例:
extern "C" const int x = 12;
extern "C" { const int y = 12; }
x
将在翻译单元外可见,y
不会。