问题标签 [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 和 extern "C"
我正在编写一个 C++ 共享库供 C 程序使用。但是,我有一个关于extern
and的问题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
,但我可以使用extern
not extern "C"
。这是为什么?这对我来说并不直观。
评论:我不认为这是重复的,因为我问的是当你将它用于变量和函数时有什么区别。
c++ - 在 extern C 中使用 _attribute__ ((nothrow)) 有意义吗?
我有一些从 C++ 调用的 C 代码。
标头类似于以下内容:
由于我已经在使用extern C
,
添加nothrow
编译器属性有什么好处吗?
是否extern C
使这变得多余?
在这种情况下应用它还有优势吗?
c++ - 将 C++ 库链接到 Modelica
我正在尝试在 Modelica 中使用 C++ 库。Modelica 编译器从 Modelica 源代码生成 c,然后调用 ac 编译器来创建可执行文件。Modelica 提供了一种调用 c 函数的机制。我创建了一个包装器:
外部 C 代码要么动态链接到 Modelica 可执行文件,要么如果代码是纯 c,则可以使用生成的 c 直接编译。我在这里唯一的选择是走动态链接路线。这是用于构建 C++ 库的 Makefile
当我运行 Modelica 编译器时,我得到一些链接错误,这是由于存在需要动态链接的 c++ 库。
有没有办法构建 libmywrappedcpp.so 以便 Modelica 系统调用的 c 编译器不必尝试链接 c++?
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::string
and可以更轻松、更省钱地解决问题#include <algorithm>
。
当我这样做时,有时在 C++ 中使用 C 构造是否有优势,或者如果可能的话,是否应该始终避免使用它们?我只用 C++ 中的 C 代码做了一些小规模的练习题,但它已经引起了相当多的头痛,并迫使我仔细研究引擎盖,即使我已经编写了相当多的 C 代码。还是您更愿意推荐使用extern C
限定符并用纯 C 编写 C 代码?
c++ - clang++ 是否忽略了一些弃用警告的 extern "C"?
如果我使用 clang 3.8.1 编译:
我收到警告:
...我真的不应该得到这个,因为内部函数是 C 代码。如果我使用 GCC 6.3.1,即使使用-Wall
,我也不会收到此警告。
这是一个clang错误还是我做错了什么?
ios - 将数据从 unity3d 传递到 iOS 时无法推送另一个视图控制器
我在 unity 3d 和 iOS 之间架起了一座桥梁来传递数据。我可以使用 extern "C" 将数据从 unity 3d 成功发送到我的 iOS,然后我可以从 extern "c" 的方法调用目标 c 方法。但是从客观 c 方法来看,如果我想推送另一个视图控制器,那么它会崩溃并显示以下问题。
我该如何解决这个问题?
这是我的视图控制器类:
c++ - 你应该在只有定义的文件中使用 extern "C" 吗?
有没有意义:
“代码...”只是一堆定义和类型定义(不包含等)?
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
这并不能解释太多。
c++ - 无法从 C 代码调用 C++ 函数
我是混合 C 和 C++ 代码的新手。在阅读了一些 SO 链接和在线阅读之后,了解了 extern 和 __cplusplus 指令的需要。不知道为什么我会收到错误。我错过了什么 ?
C++ 头文件:cppexh.h
C++ 源代码
C 代码调用 C++ 函数
但我收到编译错误:
代码第 2 版
编辑了解决编译问题但链接错误仍然存在的代码
我的 C++ 代码是一个静态库。
链接错误