问题标签 [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 投票
2 回答
978 浏览

c++ - 有没有理由在没有方法的标题上使用 extern "C" ?

我经常遇到包含extern "C"守卫
但不包含任何实际函数的 C 头文件。例如:

我知道这extern "C"可以防止函数上的名称修改,但它是否也可以防止变量和类型声明的其他接口问题?

extern "C"就结果兼容性而言,上面示例中的使用是否毫无意义?

0 投票
1 回答
401 浏览

c++ - C ++中的未知属性`extern_c`警告

我正在使用 Android NDK 在 Mac 上为 Android 构建 Cocos2d-x 游戏,并且在编译 C++ 部分时收到很多这样的警告:

危险吗?我该如何解决?

0 投票
1 回答
211 浏览

c++ - 在 C 项目中传递指向 C++ 函数的指针

我有一个巨大的 C 项目。现在我需要一个 C++ 函数来填充一些变量。

通过将函数声明为 extern "C",从 C 项目中调用该函数是没有问题的。

问题是,我需要将指针传递给 C++ 函数,并且在函数中,我想为指针赋值。但正是在这一点上,程序因“分段错误”而崩溃。

有没有办法使这项工作?还是不可能在 C 和 C++ 之间以这种方式使用指针?


在 C 中将函数作为线程调用:

标题

C++ 函数

0 投票
9 回答
13171 浏览

c++ - 为什么不能对 C 函数进行名称修改?

我最近接受了一次采访,被问到的一个问题是extern "C"C++ 代码中的用途是什么。我回答说是在 C++ 代码中使用 C 函数,因为 C 不使用名称修饰。有人问我为什么 C 不使用名称修饰,老实说我无法回答。

我知道当 C++ 编译器编译函数时,它会给函数一个特殊的名称,主要是因为我们可以在 C++ 中重载必须在编译时解析的同名函数。在 C 中,函数的名称将保持不变,或者可能在其前面带有一个 _。

我的疑问是:允许 C++ 编译器也破坏 C 函数有什么问题?我会假设编译器给它们起什么名字并不重要。我们在 C 和 C++ 中以相同的方式调用函数。

0 投票
4 回答
3699 浏览

c++ - extern "C" 如何在 C 文件中允许 C++ 代码?

为了在 C 文件中使用 C++ 代码,我读到我们可以这样做extern "C" { (where the c++ code goes here)},但是当我尝试使用 cout 打印一些东西时,我不断收到错误,因为它无法识别库。我想我只是对 extern "C" 如何允许您在 C 中使用 C++ 代码感到困惑。

0 投票
2 回答
670 浏览

c++ - 哪些类型的 C++ 函数可以放在 C 函数指针中?

我有一个 C 库,它使用函数指针结构进行回调。回调将从 C 代码中调用。

我可以将哪些类型的 C++ 函数安全地放置在要从 C 库调用的函数指针中?静态成员函数?完全指定的模板函数?非捕获 Lambda?

g++ 似乎让我可以使用以上所有内容,但我质疑将不同的调用约定和语言绑定用于 C 和 C++ 函数时的安全性。

0 投票
0 回答
1124 浏览

c++ - Visual Studio 中的外部 c 链接错误

我有一个简单的 c++ Visual Studio 项目:

标题:

当我编译 test.cpp 时,我在与 extern c 相关的 vc/include 文件中遇到许多错误,如下所示。它们仅在我添加行时出现:

我尝试了这个测试,因为另一个项目突然停止工作。
我尝试修复 Visual Studio,但没有帮助。

严重性代码描述项目文件行抑制状态错误(活动)此声明可能没有外部“C”链接testextern c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\exception 369

严重性代码描述项目文件行抑制状态错误(活动)多个重载函数实例“std::operator==”具有“C”链接 testextern c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include \异常 334

严重性代码描述项目文件行抑制状态错误 C2894 模板不能声明为具有“C”链接 testextern c:\program files (x86)\microsoft visual studio 14.0\vc\include\xtr1common 194

0 投票
3 回答
527 浏览

c++ - 如何限制对 C++ 中静态变量的访问?

我有一个名为“count”的 C 函数,如下所示:

此外,我有一个 Cpp 对象向量,每个对象都调用“计数”函数。由于计数器变量是静态的,一个对象的调用也会增加所有其他对象的计数器值。我真正想要的是每个对象的专用计数器,因为“计数”功能是被测设备并且可能不会更改。我认为这应该可以使用命名空间......有什么想法吗?


我最初的想法是使用命名空间......

并像这样从 Cpp-Object 内部调用...

它对我不起作用。知道为什么吗?

0 投票
1 回答
168 浏览

c++ - 编译目标代码中的外部“C”函数

环境是 Microsoft Visual C++ 2015 和 Windows 7。

inline extern "C"头文件中定义的函数有什么特别之处吗?我正在使用一个 SDK,其中一个标头包含这样的野兽。在我的应用程序中,我有一个单独的 TU(翻译单元),它一生中唯一的工作就是包含上述标题。就这样。里面没有其他东西。如果我深入研究生成的目标文件,我会看到extern "C"函数被拉入。这给我带来了一些不想要的副作用(我现在将忽略它们,因为它可能会分散主要问题的注意力)。

为什么会发生这种情况?客户端代码中没有任何东西(记住我唯一的 TU 是空的,除了main()入口点和那个标头)会触发这种情况发生。

更新一个小片段,可以更好地解释我遇到的问题:

这就是实际发生的事情:

FooObj.h

SDKHeader.h

我的文件.cpp

将 MyFile.cpp 编译为可执行文件失败,链接器抱怨 CallIntoAnotherC_API 是未解析的外部。

0 投票
2 回答
2322 浏览

c++ - 为什么指定 extern "C" 时 Visual Studio 无法给出未定义的引用错误?

鉴于此代码:

A2.H

A1.H

我的测试.cpp

请参阅此处了解问题的背景。

当 MyTest.cpp 被编译成可执行文件时,链接器会抱怨这SomeFunc()是一个未解析的外部文件。

这似乎是由于 A1.h 中的 TriggerIssue 的无关(错误?)声明引起的。将其注释掉会导致链接器错误消失。

有人能告诉我这里发生了什么吗?我只想了解是什么具体导致编译器在存在和不存在该声明时表现不同。上面的片段是我尝试编写一个我遇到的场景的最小可验证示例。请不要问我为什么它是这样写的。

投票者注意事项:这不是关于如何修复未解决的外部符号错误的问题。因此,请停止投票以将其关闭为重复。我没有足够的信誉来删除一直显示在这篇文章顶部的那个链接,声称这个问题“可能有一个可能的答案”。