Пространство имен C ++ как значение макроса

У меня есть простые функции делегата в моем тестовом коде 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

и так далее для читать а также записывать.

0

Решение

То, что вы хотите сделать, можно сделать гораздо проще. Вам не нужна полная мощность препроцессора:

  1. Вы не объединяете токены (:: не является частью действительного токена). Вам просто нужно напечатать один макрос рядом с другим.

  2. _FUNCTION_ это не макрос препроцессора, это строковый литерал (в gcc и другие компиляторы).

Итак, чтобы сделать то, что вы хотите, вам нужно передать имя функции в ваш макрос:

#define FAKE_PREFIX fakes::device::Flash::
#define DELEGATE_DESTINATION(func)  FAKE_PREFIX func

Затем вы определяете свои функции следующим образом:

bool Flash::write(args)
{
DELEGATE_DESTINATION(write)(args);
}

Это все вживую Вот.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]