раскрыть c макро __VA_ARGS__ элементы - PullRequest
1 голос
/ 12 июня 2019

Я хочу определить макрос как этот

#define ASSERT_EXIST(error, ...)  some-impl-here

тогда мы можем назвать это так

ASSERT_EXIST(100, a, b, c)

и следует расширить до этого

if (!a_exists)  return error("a is missing", 100);
if (!b_exists)  return error("b is missing", 100);
if (!c_exists)  return error("c is missing", 100);

Самая большая проблема в том, что я не могу легко перебрать __VA_ARGS__ в макросе.

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Существуют различные грязные приемы, в которых вы можете использовать различные макросы до определенного фиксированного числа. Однако правильное и правильное решение состоит в том, чтобы вообще не писать вариационный макрос. Намного лучше просто использовать

#define ASSERT_EXISTS(val, x) if (!x##_exists) { return error(#x " is missing", val); }

ASSERT_EXIST(100, a);
ASSERT_EXIST(100, b);
...

Или, что еще лучше, отбросьте все такие непристойные макросы в пользу удобочитаемого стандарта C.

if(!a_exists) { return error("a is missing", 100); }
if(!b_exists) { return error("b is missing", 100); }
if(!c_exists) { return error("c is missing", 100); }

Конечно, повторение кода - плохая практика, но секретные макроязыки - крайне плохая практика.

0 голосов
/ 12 июня 2019

Если вы просто хотите бросить переменное число аргументов в функцию, __VA_ARGS__ достаточно, как вы уже сделали. Чтобы обработать трендовую запятую, иногда вам может понадобиться ##.

Если вы хотите перебрать аргументы, используйте varargs из <stdarg.h>.

stdarg.h

...