Просто из любопытства, я хотел бы знать, можно ли определить макрос, который может превратить свой аргумент в литерал символа:
switch(getchar()) {
case MYMACRO(A): printf("Received A\n"); break;
case MYMACRO(a): printf("Received a\n"); break;
case MYMACRO(!): printf("Received an exclamation mark\n"); break;
default: printf("Neither a nor A nor !\n"); break;
}
Два возможных решения с головы:
Перечисление всех символов
#define LITERAL_a 'a'
#define LITERAL_b 'b'
...
#define MYMACRO(x) LITERAL_ ## x
Он не работает с MYMACRO(!)
, потому что !
не является допустимым компонентом идентификатора C.
Преобразование параметра в строковый литерал
#define MYMACRO(x) #x [0]
Он включает разыменование указателя и недействителен в таких местах, как метка case.
Я не прошу об "улучшении" вышеупомянутого оператора switch. Это просто игрушечный пример. Повторение. Это просто игрушечный пример.