1

Тема: Макрос-функція видаляє зовнішню пару круглих дужок [препроцесор]

Хочу створити макрос-функцію, яка приймає 1 арґумент (довільний* вираз), який може мати вигляд:
  (expr)  , або
(((expr))) , або
   expr    (без дужок).
І яка буде видаляти одну пару зовнішніх дужок, якщо вони існують, або вертати сам вираз, якщо зовні дужки відсутні.
Для простоти будемо ґарантувати що вираз не містить ",", ")(", або інших хитрих несподіванок.

Для цього зробив таку штуку :

#define JOIN(A, B) A##B
#define JUST(X) X
#define INSIDE(X) JOIN(JUST, X)

INSIDE видаляє рівно одну пару дужок, коли вони є, або ґенерує помилку як наслідок конкатенації (JUSTexpr).

Зараз є таке :

INSIDE( ((( i ))) )  //  (( i ))
INSIDE(  (( i ))  )  //   ( i )
INSIDE(   ( i )   )  //     i
INSIDE(     i     )  //   JUSTi

А я хочу таке :

INSIDE( ((( i ))) )  //  (( i ))
INSIDE(  (( i ))  )  //   ( i )
INSIDE(   ( i )   )  //     i
INSIDE(     i     )  //     i

Чи можливо це взагалі ?

Подякували: Chemist-i1

2

Re: Макрос-функція видаляє зовнішню пару круглих дужок [препроцесор]

Ось так?

#define  ESC(X)   CAT(ISH X)
#define  ISH(...) ISH __VA_ARGS__
#define  CAT(...) _CAT(__VA_ARGS__)
#define _CAT(...) VAN ## __VA_ARGS__
#define VANISH

int main() {
    ESC( ((( i ))) );  //  (( i ))
    ESC(  (( i ))  );  //   ( i )
    ESC(   ( i )   );  //     i
    ESC(     i     );  //     i
}

https://godbolt.org/z/n9cxooaP9

Подякували: leofun01, ReAl2

3

Re: Макрос-функція видаляє зовнішню пару круглих дужок [препроцесор]

wander написав:

Ось так

Моя реакція на цей код десь така ж (видиво, en)

І імя ESC(X) підібране дуже вдало.

4

Re: Макрос-функція видаляє зовнішню пару круглих дужок [препроцесор]

leofun01 написав:

І імя ESC(X) підібране дуже вдало.

Сарказуєте?

Додаткові присідання потрібні, щоб позбутись підставляння імені макроса для випадку, коли вираз з самого початку був без дужок. Тобто ось такого:

INSIDE(     i     )  //   JUSTi

Ну, зрештою, а що ви хотіли, це ж макроси..

Подякували: leofun011

5

Re: Макрос-функція видаляє зовнішню пару круглих дужок [препроцесор]

wander написав:
leofun01 написав:

І імя ESC(X) підібране дуже вдало.

Сарказуєте?

Ні, я думаю "escape" краще описує те, що відбудеться з виразом, ніж "inside", бо "escape" відповідає "що зробити", а "inside" відповідає "де знаходиться".

wander написав:

а що ви хотіли, це ж макроси..

Та капець .. Соромно зізнатись скільки днів я потратив на ці макроси.
На початку я взагалі намагався пхати макроси в макроси

#define IF #if
#define ELSE #else
#define ENDIF #endif
#define DEF #define
#define UNDEF #undef

, але так не можна, препроцесор не буде проходити більше ніж 1 раз.

А твій код працює так добре, що навіть вкладені template'и з комами проходять успішно.

Подякували: wander1

6

Re: Макрос-функція видаляє зовнішню пару круглих дужок [препроцесор]

Макроси - це класно, вони дійсно можуть сильно допомогти, а у деяких випадках без них, наразі, не обійтись і зовсім. Але я б не рекомендував ними аж занадто захоплюватись чи зловживати. Макроси ОК для внутрішнього використання, але я б точно не надавав макроси, як інтерфейс для користувача, хіба що як альтернативний варіант для чогось і то, лише у випадках якщо цей макрос зрозумілий (self-explanatory) та стабільний (тобто навіть якщо користувач його невірно використає - це тихенько не поламає його код, а видасть зрозумілий error). Я не знаю, що саме ви з ними робите, але це було в догін до вашої теми Наслідування шаблонів.

Подякували: leofun011