问题标签 [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.
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 库或其他东西时,您是否必须使用它?
c++ - 结合 C++ 和 C - #ifdef __cplusplus 如何工作?
我正在开发一个包含大量遗留C代码的项目。我们已经开始用 C++ 编写,目的是最终也转换遗留代码。我对C和 C++ 的交互方式有点困惑。我知道通过用 C++ 编译器包装C代码extern "C"
不会破坏C代码的名称,但我不完全确定如何实现这一点。
因此,在每个C头文件的顶部(包含保护之后),我们有
在底部,我们写
在两者之间,我们拥有所有的包含、类型定义和函数原型。我有几个问题,看看我是否理解正确:
如果我有一个包含C头文件 Bh 的 C++ 文件 A.hh,包含另一个C头文件 Ch,这是如何工作的?我认为当编译器进入 Bh 时,
__cplusplus
将被定义,因此它将用extern "C"
(并且__cplusplus
不会在此块内定义)包装代码。因此,当它进入 Ch 时,__cplusplus
不会被定义,代码也不会被包裹在extern "C"
. 这个对吗?用 包装一段代码有什么问题
extern "C" { extern "C" { .. } }
吗?第二个会extern "C"
做什么?我们不会将此包装器放在 .c 文件周围,而只是 .h 文件。那么,如果一个函数没有原型会发生什么?编译器是否认为它是 C++ 函数?
我们还使用了一些用C编写的第三方代码,并且没有这种包装器。每当我包含该库中的标题时,我都会
extern "C"
在#include 周围添加一个。这是处理这个问题的正确方法吗?最后,这是一个好主意吗?还有什么我们应该做的吗?在可预见的未来,我们将混合C和 C++,我想确保我们覆盖了所有的基础。
c++ - 名称或类型具有某种语言链接意味着什么?
根据 (c) ANSI ISO/IEC 14882:2003,第 127 页:
联动规格嵌套。当链接规范嵌套时,最里面的一个确定语言。链接规范不建立范围。链接规范应仅出现在命名空间范围 (3.3) 中。在链接规范中,指定的语言链接适用于由声明引入的所有函数声明符、函数名和变量名的函数类型。
这是什么意思呢?例如,f2()
函数有什么链接,C 或 C++ 语言链接?
正如@Johannes Schaub 所指出的,标准中没有真正解释这意味着什么,因此在不同的编译器中可以有不同的解释。
请解释目标文件中的差异:
- 具有 C 语言链接和 C++ 语言链接的函数名称。
- 具有 C 语言链接和 C++ 语言链接的函数类型。
c++ - 何时使用外部“C”?
我知道怎么用extern "C"
,但是什么时候必须用呢?
extern "C"
告诉 C++ 编译器不要对大括号内的代码执行任何名称修改。这允许您从 C++ 中调用 C 函数。
例如:
虽然这在 VC++ 上编译得很好。但有时这会写成:
我不明白这一点。你能举一个真实的例子extern "C"
吗?
c++ - extern "C" 如何在 C++ 中工作?
extern "C"
我在文件开头看到一些 C++ 代码,如下所示:
这是什么意思?它是如何工作的?
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
检查。
c++ - extern "C" 函数是单独的类型吗?
来自 C++11 草案,7.5(第 1 段):
具有不同语言链接的两个函数类型是不同的类型,即使它们在其他方面相同。
所以我可以根据语言链接进行重载:
但是,对于 GCC 4.7.1,此示例代码给出了错误消息:
并使用 CLang++ :
现在的问题:
我对标准的理解正确吗?此代码有效吗?
有人知道这些是编译器中的错误,还是出于兼容性目的而故意这样做?
c++ - extern C 返回类对象
我想要一个插件,名称更简单,可以在其他 C++ 代码中解析。
而在程序的另一部分(也是在 C++ 中并与插件共享 B 类的相同定义):
这样的代码是否会导致任何问题,即是否允许(按标准)在extern "C"
函数中使用 C++ 类作为参数或返回类型?它似乎适用于我的 gcc,但其他人呢?
c++ - 标记为 Extern "C" 的 C++ 函数可以抛出吗?
我有我想声明使用的 C++ 函数,extern "C"
即使它们只在 C++ 代码中调用。是的,我知道这很奇怪,但为了保持一致性,我想这样做,因为我们混合了 C 和 C++ 声明。我只是想确保将 C++ 函数声明为extern "C"
不会影响抛出的行为。
它看起来像这样: