Вызов функции макросом #define rasch(name)

277
17 сентября 2017, 01:21

Есть функции: bool R1() .... R55(); Хочу вызвать их с помощью макроса:

#define rasch(name) R##name()
....
rasch(i);
.....

Если вместо i подставить число (rasch(23)), то все получается. А если использовать переменную, то прога пытается вызвать функцию Ri(), что и логично. Вопрос вот в чем, как можно вызвать функцию макросом, с помощью переменной i ?

Answer 1

Макрос - это простая текстовая замена, естественно, что она заменяет текст i, а не значение переменной. Препроцессор не имеет представления даже о синтаксисе языка, а уж о том, что находится в переменной во время выполнения - не знает даже компилятор...

Проще всего - создайте массив указателей на функции примерно как

typedef viod (*func)();
func f[55] = { R1, R2, ..., R55 };

Ну и

void rasch(int i)
{
    f[i-1]();
}
Answer 2

Никак. Сделай массив указателей на функции и вызывай по индексу.

https://ideone.com/QLgqQ1

#include <iostream>
using namespace std;
void f1() { cout << "f1" << endl; }
void f2() { cout << "f2" << endl; }
void (*fs[])() = { f1, f2 };
int main()
{
  for (int q=0; q<2; ++q)
    fs[q]();
  return 0;
}
READ ALSO
Как скомпилировать драйвер без Visual Studio?

Как скомпилировать драйвер без Visual Studio?

У меня не получается скомпилировать драйвер правильно на Visual StudioА как скомпилировать просто без Visual Studio? В принципе я нашел на хабрахабр...

269
Файл конфигурации clang-format, перенос запятой на новую строку

Файл конфигурации clang-format, перенос запятой на новую строку

Добрый день, подскажите, пожалуйста, как правильно написать конфиг для clang-format, чтобы перенос длинных строк осуществлялся вместе с запятой,...

360
Инжекция dll в explorer.exe

Инжекция dll в explorer.exe

Нужно заинжектиться в explorerexe, имею dll который имеет такой код:

287