如何使用C、C++中的当前函数名调用函数



开始前,对不起我英语不好。环境:c、 c++,VS2019,C99 之后

问题:我必须调用以被调用者名称为前缀命名的函数。我有很多被调用者和变量前缀,所以我想在预处理时用宏处理它,以方便编码。

我试过了:

知道这不可能,因为func是constchar[]。

所以我需要:获取具有令牌而非字符串的函数名称。或:将字符串转换为令牌。ex(

人有解决方案吗?

这是我的实际问题。

我有很多C代码的函数。我将用gtest(C++(编写测试代码。而且我需要使用mock(或者stub.anyway(来实现函数。但是,无法调用mock函数来代替原始函数。所以我需要做一个像这样的钩子

了避免键入错误和人为错误,我想制作一个宏,使函数挂钩。现在我使用这样的宏。(未详细说明(
想去掉键入函数名的功能。

这是我的实际问题。有办法吗?

你不能按照你描述的方式来做,因为没有办法把字符串(变量或文字(变成令牌。您可以尝试一个定义调用函数的宏,例如

#define DEFINE_FUNCTION(prefix, name)  void name () { prefix ##_ ##name ();}

并使用

void foo_func() {std::cout << "foo_func()n";}     // assume <iostream> has been included
DEFINE_FUNCTION(foo, func)           // note no ; here
int main()
{
func();       
}

这将起作用,因为DEFINE_FUNCTION(foo, func)已经定义了func(),因此它调用foo_func()

一般来说,我强烈建议不要这样做。现在,使用宏似乎很方便,而不是手动定义函数。将来,当您或其他人维护/扩展代码时,这似乎不会那么方便,尤其是当某些函数需要执行与宏设置略有不同的操作时。在这种情况下,您的代码将很快变得一团糟。

也许你想要这个:

void prefix_function_name();
#define INVOKER_FUNCTION(name) 
void name () {
prefix_##name();
}
INVOKER_FUNCTION(function_name);

恐怕您选择的语言有点不合适(我指的是C++(。但是你可以使用dll-s:(在C++中(

  • 将函数打包到外部库(.dll,.so(中
  • 然后您可以按名称加载库和导出函数并调用它。请参阅boost::dll:import_alias(用于跨平台代码(、LoadLibrary和GetProcAddress(用于Windows(

最新更新