Предыстория. Мой код, который я не могу опубликовать здесь, в конечном итоге будет запускаться на микроконтроллере, а макросы просто предлагают способ создания нескольких функций определения контактов с помощью одного механизма определения одного макроса. Я использую окна и gcc, чтобы экспериментировать с ними.
Я старался максимально абстрагироваться от проблемы. Я использую консольные функции std, потому что мне удобно отображать их в окне консоли. Таким образом, я также сохраняю файл как .cpp и компилирую его с помощью g ++ в Windows.
Скажем, я установил свой код следующим образом:
#define MACRO2(_x) foo##_x(_x)
#define MACRO1(_x) MACRO2(_x)
#define BAR 3
void fooBAR(int num)
{
std::cout << num << std::endl;
}
Если я запустил следующий код (рабочий пример)
int main()
{
MACRO2(BAR);
return 0;
}
сначала BAR вставляется в ## _ x и, таким образом, определяет имя функции, которая должна быть вызвана, а затем BAR вставляется в качестве аргумента этой функции и расширяется до своего значения, поэтому мы получаем fooBAR (3). Код работает, ошибок нет.
Теперь, если я попытаюсь добавить макрос между ними (а это реальная ситуация, с которой я столкнулся по причинам, в которые я не могу войти), мой код будет выглядеть так:
int main()
{
MACRO1(BAR);
return 0;
}
Но этот код вызывает ошибку, потому что, когда MACRO1 (BAR) заменяется MACRO2 (BAR), (BAR) затем расширяется до 3, а MACRO2 (3) приводит к foo3 (3), который не определен, что подтверждается журнал ошибок:
ошибка: 'foo3' не был объявлен в этой области
Итак, требования следующие:
- Мне нужно передать BAR в MACRO1, и его нужно передать в MACRO2 без расширения
- Слово BAR должно оставаться таким, какое оно есть, я знаю, что могу использовать ##, чтобы предотвратить его расширение, но тогда мне нужно будет добавить символ в BAR, и вызов функции больше не будет работать.
Можно ли как-то это сделать? Передать макрос другому макросу в качестве аргумента без раскрытия исходного макроса в процессе?