我需要生成许多具有以下形式的 C 链接的包装器:
int myfunc (type0 param0, type1 param1, ..., typeN paramN) {
return (*g_libc.myfunc ## _fn) (param0, etc...)
}
到目前为止,我使用了很多宏:
#define NATIVE(name,...) \
auto name (FULL_ARGS(__VA_ARGS__)) \
{ \
return (*mystruct.name ## _fn) (ARGS (__VA_ARGS__)); \
}
但出于各种原因我想在 C++11 中使用可变参数模板。我有一个可用的可变参数函数,可以取代以前的hackish实现:
#define NATIVE(name) template <typename... Args> \
auto name (Args&&... args) -> decltype( name ( std::forward<Args>(args)...) ) \
{ \
return g_libc. name ## _fn (std::forward<Args>(args)...); \
}
但是这样我就会失去 C 链接(因为模板不能有 C 链接)。因此,我的想法是使用指向模板化函数的所需函数名称创建一个别名。 似乎可以使用 C 符号作为 C++ 函数的别名(可能看起来很明显,但我必须测试它并且它工作正常)。然而,为了能够为模板化函数添加别名,我需要在编译时知道它的损坏名称,这似乎很难正确(没有 gcc 扩展来做到这一点,尽管我也想支持 clang)。我的结论是,我应该添加别名作为后处理步骤。
所以问题是如何向已构建的共享库添加符号别名? (我可以“grep”“nm”输出来检索损坏的符号)
致以诚挚的问候
最佳答案
宏应该创建另一种带有 C 链接的重整函数名称,用于调用 C++ 函数。使其内联可以消除性能问题。
关于c++ - 创建 C++ 模板函数的 C 符号别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38484895/