我指的是this线程,我有相同的要求(包装函数调用),这需要extern“C”声明。
在我的情况下,这个原型是在一个单独的头文件中声明的,我不想更改这个头文件或原始代码文件(在哪个函数调用中)。 但我仍然希望编译器将我的函数看作extern“C”。 所以,我想知道是否有办法用g ++标志提供这些信息(例如“--externc = foobar”)。
答案 0 :(得分:4)
当包含C头时,如果他们没有相应的包装器[有条件地在extern "C"
]里面,你通常需要用__cplusplus
块包装它们:
extern "C" {
#include <c-header.h>
}
嵌套这些块是无害的,除了它阻止标头迁移到C ++,即内部extern "C"
- 块是可取的。如果标题是C ++标题,则需要跳转转发函数:
extern "C" void call_as_c() {
actual_cxx_function();
}
Sinply假装一个符号的链接与它实际上的不同并不完全有效。
答案 1 :(得分:1)
如果你想改变联动/调用约定(这是extern "C"
有权做的事情),几乎唯一安全的答案是在声明函数的地方改变它 - 即:在头。否则,你冒着被定义的功能与使用它的风险不同的风险,随之而来的是欢闹。
答案 2 :(得分:0)
我认为不容易(将extern "C"
后声明为在前一个标题中声明的一个函数)。
如果你只有一个这样的函数(并不是很多),我认为最简单的解决方案是更改标题,或者在包含标题之前声明函数extern "C"
(如果签名和该函数的参数或结果类型允许它,例如,如果相关类型在其他标题中定义,等等......)。
或者,写一些(例如在sed
或awk
)脚本中,这将改变标题。
你也可以考虑用例如自定义GCC。以MELT(扩展GCC的域特定语言)编码的扩展名,可以根据需要更改声明的内部表示形式。我不确定你的情况是否值得付出努力。