Предварительная обработка #define
Я не могу понять, как работает препроцессор и что ##
обозначает в этом конкретном примере
#include <stdio.h>
#define TEMP_KEY(type,Key) (TEMP_##type | Key)
enum TEMPKey_Type
{
TEMP_UNKNOWN = 0,
TEMP_SPECIAL ,
TEMP_UNICODE
};
enum Actual_Key
{
TEMP_RIGHT = TEMP_KEY(UNKNOWN,0x1),
TEMP_LEFT = TEMP_KEY(SPECIAL,0x1),
TEMP_UP = TEMP_KEY(UNICODE,0x1)
};
int main()
{
printf("\n Value of TEMP_RIGHT : %d ",TEMP_RIGHT);
printf("\n Value of TEMP_LEFT : %d ",TEMP_LEFT);
printf("\n Value of TEMP_UP : %d ",TEMP_UP);
return 0;
}
Как это #define TEMP_KEY(type,Key) (TEMP_##type | Key)
работать или как и что именно TEMP_##type
заменено во время предварительной обработки?
2 ответа
"##" означает сцепление. Следовательно TEMP_RIGHT = TEMP_KEY(UNKNOWN,0x1)
становится TEMP_RIGHT = TEMP_UNKNOWN | 0x1,
("TEMP_" и "UNKNOWN" объединены)
##
является оператором конкатенации в директивах #define.
Например, тип TEMP_## для вызова TEMP_KEY(UNICODE,0x1) генерирует следующий код:
(TEMP_UNICODE | 0x1)