问题标签 [extern-c]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
32778 浏览

c++ - 何时用简单的单词使用 extern "C"?

也许我不了解 C 和 C++ 之间的区别,但是我们何时以及为什么需要使用

? 显然它是一个“链接约定”。

我简要地阅读了它,并注意到 MSVS 中包含的所有 .h 头文件都用它包围了它们的代码。究竟什么类型的代码是“C 代码”而不是“C++ 代码”?我以为 C++ 包含所有 C 代码?

我猜测情况并非如此,C++ 是不同的,标准特性/功能存在于其中之一但不是两者都存在(即:printf 是 C,cout 是 C++),但是 C++ 是向后兼容的,尽管外部“C”声明。这个对吗?

我的下一个问题取决于第一个问题的答案,但无论如何我都会在这里问:由于用 C 编写的 MSVS 头文件被 extern "C" { ... } 包围,你什么时候需要使用它自己在自己的代码中?如果您的代码是 C 代码并且您正尝试在 C++ 编译器中编译它,那么它不应该毫无问题地工作吗,因为您包含的所有标准 h 文件都已经在 C++ 编译器中包含了 extern "C" 的东西?

在 C++ 中编译但链接到已构建的 C 库或其他东西时,您是否必须使用它?

0 投票
4 回答
256350 浏览

c++ - 结合 C++ 和 C - #ifdef __cplusplus 如何工作?

我正在开发一个包含大量遗留C代码的项目。我们已经开始用 C++ 编写,目的是最终也转换遗留代码。我对C和 C++ 的交互方式有点困惑。我知道通过用 C++ 编译器包装C代码extern "C"不会破坏C代码的名称,但我不完全确定如何实现这一点。

因此,在每个C头文件的顶部(包含保护之后),我们有

在底部,我们写

在两者之间,我们拥有所有的包含、类型定义和函数原型。我有几个问题,看看我是否理解正确:

  1. 如果我有一个包含C头文件 Bh 的 C++ 文件 A.hh,包含另一个C头文件 Ch,这是如何工作的?我认为当编译器进入 Bh 时, __cplusplus将被定义,因此它将用extern "C" (并且__cplusplus不会在此块内定义)包装代码。因此,当它进入 Ch 时, __cplusplus不会被定义,代码也不会被包裹在 extern "C". 这个对吗?

  2. 用 包装一段代码有什么问题 extern "C" { extern "C" { .. } }吗?第二个会extern "C" 做什么?

  3. 我们不会将此包装器放在 .c 文件周围,而只是 .h 文件。那么,如果一个函数没有原型会发生什么?编译器是否认为它是 C++ 函数?

  4. 我们还使用了一些用C编写的第三方代码,并且没有这种包装器。每当我包含该库中的标题时,我都会extern "C"在#include 周围添加一个。这是处理这个问题的正确方法吗?

  5. 最后,这是一个好主意吗?还有什么我们应该做的吗?在可预见的未来,我们将混合C和 C++,我想确保我们覆盖了所有的基础。

0 投票
3 回答
469 浏览

c++ - c中的extern关键字

可能重复:
为什么我们在 C++ 中需要 extern “C”{ #include <foo.h> }?

在我们的代码中,我多次看到如下语句:

这到底是什么意思?

0 投票
7 回答
2250 浏览

c++ - 名称或类型具有某种语言链接意味着什么?

根据 (c) ANSI ISO/IEC 14882:2003,第 127 页:

联动规格嵌套。当链接规范嵌套时,最里面的一个确定语言。链接规范不建立范围。链接规范应仅出现在命名空间范围 (3.3) 中。在链接规范中,指定的语言链接适用于由声明引入的所有函数声明符、函数名和变量名的函数类型。

这是什么意思呢?例如,f2()函数有什么链接,C 或 C++ 语言链接?

正如@Johannes Schaub 所指出的,标准中没有真正解释这意味着什么,因此在不同的编译器中可以有不同的解释。

请解释目标文件中的差异:

  • 具有 C 语言链接和 C++ 语言链接的函数名称。
  • 具有 C 语言链接和 C++ 语言链接的函数类型。
0 投票
6 回答
834 浏览

c++ - 何时使用外部“C”?

我知道怎么用extern "C",但是什么时候必须用呢?

extern "C"告诉 C++ 编译器不要对大括号内的代码执行任何名称修改。这允许您从 C++ 中调用 C 函数。

例如:

虽然这在 VC++ 上编译得很好。但有时这会写成:

我不明白这一点。你能举一个真实的例子extern "C"吗?

0 投票
4 回答
617 浏览

c++ - extern "C" 如何在 C++ 中工作?

extern "C"我在文件开头看到一些 C++ 代码,如下所示:

这是什么意思?它是如何工作的?

0 投票
2 回答
6232 浏览

c++ - 我们可以在没有#ifdef __cplusplus 的情况下在 C 文件中使用 extern "C" 吗?

为什么不应该extern "C"为需要定义为 C 函数的函数指定?将文件编译为 C 源代码时会对编译器产生什么影响?

如果对 C 编译器没有影响,我们不能通过删除#ifdef __cplusplus检查在下面的头文件中定义一个函数吗?

另一个问题的答案#ifdef需要,但我不明白为什么:

关于#2: __cplusplus 将为通过 C++ 编译器运行的任何编译单元定义。通常,这意味着 .cpp 文件和该 .cpp 文件包含的任何文件。如果不同的编译单元包含相同的 .h(或 .hh 或 .hpp 或 what-have-you),则可以在不同时间将它们解释为 C 或 C++。如果您希望 .h 文件中的原型引用 C 符号名称,则它们extern "C"在被解释为 C++ 时必须具有,而在被解释为 C 时不应具有extern "C"- 因此进行#ifdef __cplusplus检查。

0 投票
3 回答
540 浏览

c++ - extern "C" 函数是单独的类型吗?

来自 C++11 草案,7.5(第 1 段):

具有不同语言链接的两个函数类型是不同的类型,即使它们在其他方面相同。

所以我可以根据语言链接进行重载:

但是,对于 GCC 4.7.1,此示例代码给出了错误消息:

并使用 CLang++ :

现在的问题:

  • 我对标准的理解正确吗?此代码有效吗?

  • 有人知道这些是编译器中的错误,还是出于兼容性目的而故意这样做?

0 投票
3 回答
2048 浏览

c++ - extern C 返回类对象

我想要一个插件,名称更简单,可以在其他 C++ 代码中解析。

而在程序的另一部分(也是在 C++ 中并与插件共享 B 类的相同定义):

这样的代码是否会导致任何问题,即是否允许(按标准)在extern "C"函数中使用 C++ 类作为参数或返回类型?它似乎适用于我的 gcc,但其他人呢?

0 投票
4 回答
6216 浏览

c++ - 标记为 Extern "C" 的 C++ 函数可以抛出吗?

我有我想声明使用的 C++ 函数,extern "C"即使它们只在 C++ 代码中调用。是的,我知道这很奇怪,但为了保持一致性,我想这样做,因为我们混合了 C 和 C++ 声明。我只是想确保将 C++ 函数声明为extern "C"不会影响抛出的行为。

它看起来像这样: