c++ - C/C++ 别名函数到具有不同参数的其他函数

标签 c++ c c-preprocessor

以下是关于我想做什么以及为什么要做的一些背景知识。实际问题在最底部......

我有一个具有某种格式的 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/

相关文章:

c++ - 尾随返回类型函数语法中的 auto 关键字背后是否有意图?

c - 在 C 中进行 UDP 广播需要什么?

c++ - x = x+++++x; 的评估顺序是什么?是?

c - 使用 C 的 regex.h lib 解析 key = value 的正则表达式是什么

c++ - 由定义指令定义的类名。可能的?

c++ - 如何在异步线程中中断?

c++ - 如何调用 C DLL 函数 C++/CLI

c++ - X11 中每个窗口的 Display 都是唯一的吗?

c - 我应该修改什么以仅预处理整个项目中的所有 C 文件?

c++ - 如何根据预处理器定义的宏关闭 C++ 库的子模块