@amateurCoder
любитель по программировать

Возможно ли выражение наподобие #define name #if fds == fds *dosomething* #else *dosomething* #endif сделать валидным в Си? И, если да, то как?

для практики делал собственный интерпретатор приманного мною ЯПа. Я делал его не как положено, а просто соединил все этапы в один цикл, но не это суть. Когда начал делать систему команд (хотел для начала сделать просто print встроенный в интерпретатор, а не в виде отдельной функций) решил сделать систему состояний из макросов. И там понадобилась подобная следующей конструкция:
#define somemacro(arg) #if arg == sd\
        printf ("some text 1");\
        #else\
        printf ("some text 2");\
        #endif

Но компилято, т.к. конструкция #if #else #endif не может быть записана в одну строчку. Возможно ли как-то сделать эту конструкцию валидной или сделать эквивалент, который работает также?
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ответы на вопрос 2
@TheCalligrapher
Сделать именно это: нет, невозможно. Определения макросов препроцессора не могут содержать директивы препроцессора.

Сделать "эквивалент, который работает также" (sic): никто не знает ответа на этот вопрос, потому что вы не удосужились внятно объяснить, что вы пытаетесь сделать этим загадочным набором лексем. Ключевым моментом здесь является характер условия arg == sd. Это значение времени компиляции?

В любом случае, не ясно, чем вас не устроило обычное

#define somemacro(arg) if ((arg) == (sd))\
  printf ("some text 1");\
else\
  printf ("some text 2");
Ответ написан
@Gryphon88
Нечто подобное можно сделать через P99, M4 или Boost.Preprocessor, но так делать не надо: это очень чёрная магия (фактически - декларативное программирование в терминах Рефал-машины), и уже через пару недель Вы забудете, как оно вообще работает. Если уж так нужно сделать кодогенерацию, используйте соответствующие инструменты, в крайнем случае в pre-build вставьте перловый или питоновский скрипт, который будет парсить и достраивать имеющийся код на С.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы