Предварительная обработка #define - PullRequest
2 голосов
/ 16 февраля 2011

Я не могу понять, как работает препроцессор и что означает ## в данном конкретном примере

#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 ]

4 голосов
/ 16 февраля 2011

«##» означает сцепление. Следовательно, TEMP_RIGHT = TEMP_KEY(UNKNOWN,0x1) становится TEMP_RIGHT = TEMP_UNKNOWN | 0x1, ("TEMP_" и "UNKNOWN" объединены)

2 голосов
/ 16 февраля 2011

## является оператором объединения в директивах #define.

Например, тип TEMP _ ## для вызова TEMP_KEY (UNICODE, 0x1) генерирует следующий код:

(TEMP_UNICODE | 0x1)
...