Создание функции с помощью прототипа и прототипа указателя функции

0

Я хочу раз и навсегда создать красивую и блестящую версию этого mocks для C-кода.

Я хочу создать макрос котла, как показано ниже:

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

В коде (или заголовке) его следует использовать следующим образом: 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 */

Я хорошо знаю, что не все возможно, но я хочу приблизиться к этому, как только получится. Пока компоновщик не жалуется и не находит своих символов, я тоже не буду жаловаться. И я не возражаю, если это два разных макроса: один для определения статических членов, а другой для прототипов.

Добавление из комментария

генерировать большую часть материала легко, проблема, которую я не делаю, - это то, как 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 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);
}
  • 0
    Пожалуйста, покажите свою попытку, чтобы мы могли помочь вам исправить это.
  • 0
    @ Бармар: вот что-то . Я не понял, как втиснуть свой собственный код. И я не представляю, как я могу на самом деле передать сигнатуру, похожую на гугл-макет, при этом расширяясь до того, что компоновщик примет как символ.
Теги:
googlemock

1 ответ

1
Лучший ответ

Возможный способ решения вашей ближайшей проблемы (как получить от 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 как быстрый способ реализовать список типов).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню