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

c++ - 用于变量的 extern 和 extern "C"

我正在编写一个 C++ 共享库供 C 程序使用。但是,我有一个关于externand的问题extern "C"

考虑以下代码

我的头文件是这样的:

这工作得很好;我只需要声明

在我的 .cpp 或我的 .c 文件中。但是,我不明白的是:

extern "C"和这里有什么区别extern?我尝试发表评论extern "C" int global并且它有效!为什么?

我知道那extern "C"是用来制作C链接的。这就是为什么我有extern "C" int addnumbers(int,int). 换句话说,如果我想编写一个要在 C 程序中使用的 C++ 函数,我会编写extern "C". 现在,全局变量呢?我猜这里的情况有所不同?我希望 C 程序使用名为 的 C++ 变量global,但我可以使用externnot extern "C"。这是为什么?这对我来说并不直观。

评论:我不认为这是重复的,因为我问的是当你将它用于变量和函数时有什么区别。

0 投票
1 回答
264 浏览

c++ - 在 extern C 中使用 _attribute__ ((nothrow)) 有意义吗?

我有一些从 C++ 调用的 C 代码。
标头类似于以下内容:

由于我已经在使用extern C
添加nothrow编译器属性有什么好处吗?

是否extern C使这变得多余?
在这种情况下应用它还有优势吗?

0 投票
0 回答
384 浏览

c++ - 将 C++ 库链接到 Modelica

我正在尝试在 Modelica 中使用 C++ 库。Modelica 编译器从 Modelica 源代码生成 c,然后调用 ac 编译器来创建可执行文件。Modelica 提供了一种调用 c 函数的机制。我创建了一个包装器:

外部 C 代码要么动态链接到 Modelica 可执行文件,要么如果代码是纯 c,则可以使用生成的 c 直接编译。我在这里唯一的选择是走动态链接路线。这是用于构建 C++ 库的 Makefile

当我运行 Modelica 编译器时,我得到一些链接错误,这是由于存在需要动态链接的 c++ 库。

有没有办法构建 libmywrappedcpp.so 以便 Modelica 系统调用的 c 编译器不必尝试链接 c++?

0 投票
2 回答
101 浏览

c++ - 我可以在 C++ 中的 const 指针上有一个指针吗?

基本上我想知道是否像

在保留const限定符的同时是可能的。

我的问题是在关于 C++ 中的 C-Arrays 的练习中提出的。因为 C,我不得不传递一个带const void*参数的函数指针。在这种情况下,它指向一个 C 字符串数组。要将其转换为正确的类型,我必须将 const 丢弃。C++ 中有没有办法获得类似“(const char*)*”的指针?

我已经尝试过const char**(没有 const_cast)产生

reinterpret_cast 从类型 'const void*' 到类型 'const char**' 抛弃限定符

(const*)*,这给出了一个语法错误

'(' 标记之前的预期类型说明符

这是一个纯粹的学术问题。我知道,使用std::stringand可以更轻松、更省钱地解决问题#include <algorithm>

当我这样做时,有时在 C++ 中使用 C 构造是否有优势,或者如果可能的话,是否应该始终避免使用它们?我只用 C++ 中的 C 代码做了一些小规模的练习题,但它已经引起了相当多的头痛,并迫使我仔细研究引擎盖,即使我已经编写了相当多的 C 代码。还是您更愿意推荐使用extern C限定符并用纯 C 编写 C 代码?

0 投票
1 回答
375 浏览

c++ - 从动态 dll 链接静态库时未解析的外部类成员

MS Visual Studio 2008。这似乎是一个名称混淆问题,但我找不到正确的搜索词来提供答案。

我有一个动态库,其中有一个类,它使用静态日志库中的日志类。动态库在项目设置中导入静态库。我在其他项目中使用这个静态库,所以我知道它编译和链接没有错误。

示例代码:

动态.h:

动态.cpp:

MyClass.h:

链接器:

编辑:考虑可能是 Unicode 或 MFC 问题,我检查了 Dynamic 项目的项目设置:

动态项目设置

测井项目:

记录项目设置

还有另外两个项目也毫无问题地引入了 Logging:

工作项目设置 1

工作项目设置 2

我能看到的唯一区别是不工作的那个是作为动态 dll 构建的。

0 投票
2 回答
1202 浏览

c++ - clang++ 是否忽略了一些弃用警告的 extern "C"?

如果我使用 clang 3.8.1 编译:

我收到警告:

...我真的不应该得到这个,因为内部函数是 C 代码。如果我使用 GCC 6.3.1,即使使用-Wall,我也不会收到此警告。

这是一个clang错误还是我做错了什么?

0 投票
0 回答
299 浏览

ios - 将数据从 unity3d 传递到 iOS 时无法推送另一个视图控制器

我在 unity 3d 和 iOS 之间架起了一座桥梁来传递数据。我可以使用 extern "C" 将数据从 unity 3d 成功发送到我的 iOS,然后我可以从 extern "c" 的方法调用目标 c 方法。但是从客观 c 方法来看,如果我想推送另一个视图控制器,那么它会崩溃并显示以下问题。

我该如何解决这个问题?

这是我的视图控制器类:

0 投票
2 回答
73 浏览

c++ - 你应该在只有定义的文件中使用 extern "C" 吗?

有没有意义:

“代码...”只是一堆定义和类型定义(不包含等)?

0 投票
0 回答
290 浏览

c++ - 外部“C”函数中的通用 lambda

以下代码被 gcc 6 和 clang 4 接受,但声称支持 C++14(尤其是通用 lambda)的 MSVC 2017 将其丢弃error C2894: templates cannot be declared to have 'C' linkage

我知道通用 lambda 在内部转换为具有模板化调用运算符的某些结构,但它如何干扰外部“C”?

这是MSVC中的错误吗?您能否建议在外部“C”函数中使用通用 lambda 的解决方法?

更新

我向微软报告了这个问题,得到的回应是

感谢您的反馈意见!我们已确定此问题不是错误。请参阅 msdn https://msdn.microsoft.com/en-us/library/95bhc9c2.aspx

这并不能解释太多。

0 投票
5 回答
575 浏览

c++ - 无法从 C 代码调用 C++ 函数

我是混合 C 和 C++ 代码的新手。在阅读了一些 SO 链接和在线阅读之后,了解了 extern 和 __cplusplus 指令的需要。不知道为什么我会收到错误。我错过了什么 ?

C++ 头文件:cppexh.h

C++ 源代码

C 代码调用 C++ 函数

但我收到编译错误:

代码第 2 版

编辑了解决编译问题但链接错误仍然存​​在的代码

我的 C++ 代码是一个静态库。

链接错误