gpt4 book ai didi

c++ - 使用预处理器和函数指针原型(prototype)创建函数

转载 作者:行者123 更新时间:2023-11-28 06:56:35 25 4
gpt4 key购买 nike

我想一劳永逸地为这个 mocks for C code 创建一个漂亮而 Shiny 的版本.

我想创建一个样板宏,如下所示:

#define MOCK_FREE_FUNCTION(NAME, SIGN, MOCK) \
/* whatever goes here */

在代码(或 header )中,它应该像这样使用:MOCK_FREE_FUNCTION2(myFunc, void(char *, const char *), myFuncMock); 并扩展为某些内容

struct Whatever_myFunc {
MOCK_CONST_METHOD2(myFunc, void (char *x, char *y));
};

Whatever_myFunc myFuncMock;

extern "C" {
void myFunc(char *x, char *y) {
myFuncMock.(x,y);
}
}

/* maybe some convenience EXPECT_CALL thing */

我很清楚并非所有事情都是可能的,但我想尽可能地接近它。只要链接器不提示并找到它的符号,我也不会提示。我不介意它是否是两个不同的宏:一个用于定义静态成员,另一个用于原型(prototype)。

评论补充

生成大部分内容很容易我没有完成的问题是gmock 如何设法从

MOCK_METHOD2(foo, void(char *, char*)

类似于void foo(char *, char*)

这是我能想到的最接近的事情:

#include <stdio.h>

#define MOCK_FREE_FUNCTION2(NAME, MOCK, RET, ARGS) \
typedef RET (*NAME ## Type) ARGS; \
NAME ## Type NAME = barfoo_f;

/* ok it's callable, but how do I get my own code inside here? */
void barfoo_f(int i, int j) {
printf ("hello world %d %d\n", i, j);
}

// How does google mock get rid of , in the prototype
MOCK_FREE_FUNCTION2(FooBar, XXX, void, (int,int));

int main(int argc, char **argv) {
FooBar(1,2);
}

最佳答案

一种可能的方法来解决您的临近问题(如何从 MACRO(foo, void(char*, char*))void foo(char*, char*)) 可以与函数特征结合使用:

template <typename F>
struct func_traits;

template <typename R, typename... Args>
struct func_traits<R(Args...)>
{
using return_type = R;

template <size_t I>
using arg_type = typename std::tuple_element<I, std::tuple<Args...>>::type;
};

#define MACRO_2(NAME, TYPE) \
func_traits<TYPE>::return_type NAME(func_traits<TYPE>::arg_type<0> arg0, \
func_traits<TYPE>::arg_type<1> arg1)

(我只是使用 std::tuple 作为在这里实现类型列表的快速方法。)

关于c++ - 使用预处理器和函数指针原型(prototype)创建函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23090573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com