【发布时间】:2021-09-19 15:00:15
【问题描述】:
在开始之前,对不起我的英语不好。 环境: c、c++、VS2019、C99之后
问题: 我必须调用以被调用者名称前缀命名的函数。 我有很多被调用者和变量前缀,所以我想在预处理时处理它以方便编码。
我试过了:
`void prefix_function_name();
void function_name(){
(prefix_##__func__)();
}
`
我知道这是不可能的,因为 func 是 const char[]。
所以我需要 : 使用标记而不是字符串获取函数名称。 要么 : 将字符串转换为令牌。 例如)
void foo(); const char[] a = "foo";
a();
有人有解决办法吗?
这是我的实际问题。
我有很多用 C 代码编写的函数。 我将使用 gtest(C++) 编写测试代码。 而且我需要对函数使用模拟(或存根)。 但是,没有办法调用模拟函数而不是原始函数。 所以我需要像这样制作钩子
`extern "C" void mock_foo();
void foo(){
return mock_foo(); // hook
... // actual code
}
`
为了避免打字错误和人为错误,我想制作一个宏来为函数制作钩子。 现在我正在使用这样的宏。 (不详)
`#define MACRO(func_name) return mock_##func_name();
void foo(){
MACRO(foo) // hook
... // actual code
}
`
而且我想摆脱键入函数名称。
这是我的实际问题。有什么办法吗?
【问题讨论】:
-
这是什么语言?请选择一个。这看起来像xy problem。你为什么需要这个?
(prefix_##__func__)();(假设它会起作用)如何比prefix_function_name()更好? -
我的意思是在
function_name内部,当前函数的名称始终是function_name没有宏或运行时效果可以改变它 -
为什么不直接硬编码呢?解释你的完整场景
-
我想这是一个人必须以艰苦的方式学习的课程之一:宏不方便编码,相反。我花了一段时间才被说服,因为起初它们看起来很酷
-
我支持上述 cmets:您可能试图以错误的方式解决您的问题。请描述实际问题,只有那么才能选择合适的解决方法。