有没有办法使用 g++ 标志将函数声明为 extern "C"?
Is there any way to declare function as extern "C" with g++ flag?
我指的是这个线程,我有同样的要求(包装函数调用),它需要extern"C"声明。
在我的例子中,这个原型是在一个单独的头文件下声明的,我不想更改这个头文件或原始代码文件(在其中进行函数调用)。但我仍然希望编译器将我的函数视为外部"C"。因此,我想知道是否有一种方法可以用g++标志(例如类似"--externc=foobar"的东西)来提供这些信息。
当包含C标头时,如果它们内部没有相应的包装器[条件是__cplusplus
],则通常需要用extern "C"
块包装它们:
extern "C" {
#include <c-header.h>
}
嵌套这些块是无害的,只是它阻止了头迁移到C++,即内部extern "C"
-块是首选的。如果标头是C++标头,则需要跳过转发功能:
extern "C" void call_as_c() {
actual_cxx_function();
}
假装一个符号的链接与实际不同是行不通的。
如果您想更改链接/调用约定(extern "C"
完全有权这样做),几乎唯一安全的答案是在函数声明的地方更改它,即:在标头中。否则,你可能会冒着函数定义与使用不同的风险,随之而来的是欢乐。
我认为这并不容易(将前一个标头中声明的一个函数后声明为extern "C"
)。
如果你只有一个这样的函数(而不是很多),我认为最简单的解决方案是更改标头,或者在包含标头之前声明函数extern "C"
(如果签名和该函数的参数或结果类型允许,例如,如果在其他标头中定义了相关类型,等等)
或者,编写一些(例如在sed
或awk
中)脚本来转换标头。
您也可以考虑自定义GCC,例如使用MELT(一种扩展GCC的特定领域语言)编码的扩展,这将根据您的意愿更改您声明的内部表示。我不确定你这样做是否值得。
相关文章:
- 使用说明符 extern 声明的C++中的标识符链接
- 如何使用默认值将枚举声明为 extern
- "extern"声明以及带有和不带参数列表的类模板实例的后续定义
- 在命名空间 c++ 中正确声明 extern 变量
- 有什么方法可以在标头中定义和声明 extern 对象吗?
- 在 extern 中声明一个使用向量的函数 "C" {}
- C++中未初始化的引用(使用 extern 声明)
- 不可变的全局对象应该声明为"const my_result_t BLAH"还是"extern const my_result_t BLAH;"?
- 如何使 extern 方法在共享库中定义,但使用 cmake 在其他目标中声明?
- GNU 链接器:如果头文件中的指针被声明为 NULL 和/或 extern,则出错
- 如何在不同的命名空间中使用双重声明的 extern "C"函数进行 clang 构建(如 msvc 和 gcc)
- 为什么我不能在标头中只定义一个非常量 gloabal 变量?如果我使用命名空间,为什么我必须声明它"extern"?
- 使用extern的正向声明(在C/C++的上下文中)
- Extern const,它是声明,也是正向声明
- 为什么我应该使用extern关键字来声明命名空间范围中的变量
- 默认情况下全局变量是 extern 还是等效于在全局中使用 extern 声明变量
- 有没有办法使用 g++ 标志将函数声明为 extern "C"?
- 在模板实例化和extern模板声明中使用typedef
- 如何链接.h文件中声明为extern的函数,以创建.dll文件
- SWIG错误:已声明'extern'然后'静态'