У меня есть простые функции делегата в моем тестовом коде C ++. Так как я не могу включить исходные файлы реализации .cpp (встроенные), я использую файл делегата .cpp в тестах, выполняемых на ПК. Моя идея состоит в том, чтобы просто использовать тот же макрос в качестве тела для реализации, за исключением скобок () и аргументов, которые будут предоставлены в соответствии с подписью.
Я попробовал что-то вроде:
void Flash::init()
{
DELEGATE_DESTINATION();
}
bool Flash::write(args)
{
DELEGATE_DESTINATION(args);
}
bool Flash::read(args)
{
DELEGATE_DESTINATION(args);
}
куда
void Flash::init()
bool Flash::write(args)
bool Flash::read(args)
Идентичны тем, что есть у внедренного проекта. В тестовых файлах я просто передаю вызов фальшивым реализациям. Я знаю, что одним из возможных решений было бы включение сигнатуры и реализации в фальшивые классы, не использующие ретрансляцию.
Я с трудом разбираюсь в макросе. Я попробовал что-то вроде:
#define FAKE_PREFIX fakes::device::Flash::
#define DELEGATE_DESTINATION FAKE_PREFIX##__FUNCTION__
Который расширяется до FAKE_PREFIX__FUNCTION__
Ну тогда после прохождения C препроцессор, Stringify результат макроса
Я могу получить только подделками расширяется на месте.
Моя цель будет иметь такой результат, как
fakes::device::Flash::init
и так далее для читать а также записывать.
То, что вы хотите сделать, можно сделать гораздо проще. Вам не нужна полная мощность препроцессора:
Вы не объединяете токены (::
не является частью действительного токена). Вам просто нужно напечатать один макрос рядом с другим.
_FUNCTION_
это не макрос препроцессора, это строковый литерал (в gcc и другие компиляторы).
Итак, чтобы сделать то, что вы хотите, вам нужно передать имя функции в ваш макрос:
#define FAKE_PREFIX fakes::device::Flash::
#define DELEGATE_DESTINATION(func) FAKE_PREFIX func
Затем вы определяете свои функции следующим образом:
bool Flash::write(args)
{
DELEGATE_DESTINATION(write)(args);
}
Это все вживую Вот.
Других решений пока нет …