Сколько можно сделать с помощью макросов (более высокого порядка)?

StackOverflow https://stackoverflow.com/questions/829837

  •  06-07-2019
  •  | 
  •  

Вопрос

"Безопасно" ли присваивать имена макросов в качестве аргументов другим макросам для имитации функций более высокого порядка?

То есть.куда мне следует смотреть, чтобы не прострелить себе ногу?

Вот несколько фрагментов:

#define foreach_even(ii, instr) for(int ii = 0; ii < 100; ii += 2) { instr; }
#define foreach_odd(ii, instr)  for(int ii = 1; ii < 100; ii += 2) { instr; }

#define sum(foreach_loop, accu) \
  foreach_loop(ii, {accu += ii});

int acc = 0;
sum(foreach_even, acc);
sum(foreach_odd, acc);

Как насчет частичного применения, могу ли я это сделать?:

#define foreach(ii, start, end, step, instr) \
  for(int ii = start; ii < end; ii += step) { instr; }

#define foreach_even(ii, instr) foreach(ii, 0, 100, instr)
#define foreach_odd(ii, instr)  foreach(ii, 1, 100, instr)

#define sum(foreach_loop, accu) \
  foreach_loop(ii, {accu += ii});

int acc = 0;
sum(foreach_even, acc);
sum(foreach_odd, acc);

И могу ли я определить макрос внутри макроса?

#define apply_first(new_macro, macro, arg) #define new_macro(x) macro(arg,x)
Это было полезно?

Решение

Если вы хотите использовать препроцессор как можно чаще, вы можете попробовать boost.препроцессор.

Но имейте в виду, что это небезопасно чтобы сделать это.Запятые, например, вызывают большое количество проблем при использовании препроцессоров.Не забывайте, что препроцессоры не понимают (или даже не пытаются понять) ничего из генерируемого ими кода.

Мой основной совет - "не делай этого" или "делай это как можно осторожнее".

Другие советы

Я полностью внедрил прогнивший маленький фреймворк модульного тестирования в c-препроцессоре.Несколько десятков макросов, множество макросов - это аргумент для другого типа макросов.

Такого рода вещи - это не "безопасный" в передовом смысле этого слова.Есть тонкие и очень действенные способы выстрелить себе в ногу.Проект модульного тестирования - это игрушка, вышедшая из-под контроля.

Не знаю, можете ли вы вложить определения макросов.Я сомневаюсь в этом, но я пойду попробую ... gcc это не нравится, и он отвечает

вложенный файл_макро.cc:8:ошибка:случайный '#' в программе
вложенный файл_макро.cc:3:ошибка:ожидаемый конструктор, деструктор или преобразование типа перед '(' токеном
вложенный файл_макро.cc:3:ошибка:ожидаемое объявление перед токеном '}'

Самостоятельная вилка:Если вам интересно, фреймворк модульного тестирования можно найти по адресу https://sourceforge.net/projects/dut/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top