以下是关于我想做什么以及为什么要做的一些背景知识。实际问题在最底部......
我有一个具有某种格式的 API。 例如
int f(void *str1, void *str2) {...}
我想重新实现 API 背后的系统,以便它可以替代旧系统。然而,事实证明 str1
现在是不必要的,而且如果您知道您正在使用我的新系统,那么拥有它也没有意义。因此,我希望能够公开有意义的底层 API:
int f_internal(void *str2);
现在我的代码看起来像这样:
#ifdef USE_INTERNAL
#define INTERNAL(sym) sym##_internal
#else
#define INTERNAL(sym) sym
#endif
extern "C" {
#ifndef USE_INTERNAL
int f(void *str1, void *str2){
return INTERNAL(f)(str2);
}
#endif
SOME_ATTRIBUTES
int
INTERNAL(f)(void *str2){
... // actual content
} EXPORT_FUNCTION_MACRO(INTERNAL(f), 1);
}
效果是,如果我定义了 USE_INTERNAL
,对 f(a) 的调用有效,但我没有定义它,那么我们必须使用 f(a, b)。
我遇到的问题是 EXPORT_FUNCTION_MACRO
本身定义了另一个函数名称,但没有首先评估 INTERNAL(F)
。这导致消息
dir: error: pasting ")" and "_" does not give a valid preprocessing token
INTERNAL(sym) \
--- NOTE--- EXPORT_FUNCTION_MACRO takes args 'sys' and 'n'
other_dir: note: in definition of macro ‘EXPORT_FUNCTION_MACRO’
void _example##sym##_##n(void) {} \
我想做什么:
我想要一个编译标志,它可以改变调用某些东西所需的参数数量。 也许像(如果它存在的话)
using f(a, b) = f_internal(a);
有什么想法吗?
最佳答案
This results in the message
为了修复消息,让宏参数在连接它们之前展开。
#define EXPORT_FUNCTION_MACRO_X(sys, n) EXPORT_FUNCTION_MACRO(sys, n)
EXPORT_FUNCTION_MACRO_X(INTERNAL(f), 1);
关于c++ - C/C++ 别名函数到具有不同参数的其他函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59379005/