有没有办法使用 g++ 标志将函数声明为 extern "C"?

Is there any way to declare function as extern "C" with g++ flag?

本文关键字:声明 extern 函数 标志 g++ 有没有      更新时间:2023-10-16

我指的是这个线程,我有同样的要求(包装函数调用),它需要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"(如果签名和该函数的参数或结果类型允许,例如,如果在其他标头中定义了相关类型,等等)

或者,编写一些(例如在sedawk中)脚本来转换标头。

您也可以考虑自定义GCC,例如使用MELT(一种扩展GCC的特定领域语言)编码的扩展,这将根据您的意愿更改您声明的内部表示。我不确定你这样做是否值得。