В вашем сообщении есть две заметки.Во-первых, это не работает, как вы думаете.Это также выдаст предупреждение
#define ID B
#if ID == A
#warning "hello, world"
#endif
Причина в том, что в контексте #if
токены предварительной обработки ID
и A
воспринимаются как макросы и расширяются.Поскольку A
не определено, оно «расширяется» до 0. Так же, как и ID
через расширение ID
-> B
-> 0
.Таким образом, условие здесь также верно.
Это также отвечает, почему *
вызывает ошибку.Он не может быть расширен в дальнейшем (из-за того, что он не является действительным идентификатором), и поэтому вы получаете сравнение * == 0
, что является бессмысленным.
Поскольку ваш заголовок подразумевает, что вы пытаетесь сравнить с символьной константой,способ сделать это - определить ID
, чтобы развернуть в последовательность токенов символьной константы.
#define ID 'A'
#if ID == 'A'
Теперь она должна работать, как и ожидалось.Как будет #define ID '*'