2013-09-05 8 views
1
#include <stdio.h> 
#define PRINT(name) print ## name() 

void printHE() 
{ 
    printf("Hello"); 
} 
void printWO() 
{ 
    printf("World\n"); 
} 


enum { 
    HE, 
    WO, 
}; 

int main() 
{ 
    PRINT(HE); 
    PRINT(WO); 
} 

Это прекрасно работает, но почему?Что это за трюк?

Что делает ## в #define означает?

И почему HE не конвертировал в 0?

+2

Где определяется' PRINT'? – trojanfoe

+4

Вы не показываете нам '# define', поэтому мы можем только догадываться, что вы делаете. В препроцессоре '##' означает конкатенацию. –

+1

** Что ## в #define означает? ** ..Where is ** ## ** ??? –

ответ

4

Учитывая, что вы спрашиваете о ## я предполагаю, что PRINT определяется как

#define PRINT(X) print##X() 

## является оператором маркера склеивание, он соединяет два маркера слева от него и справа вместе, производя один токен.

Когда вы пишете PRINT(HE), препроцессор преобразует это значение в printHE(), что является регулярным вызовом функции.

, так как он является перечисление, он должен перевести до 0

Это очень хороший вопрос! Перевод не происходит, поскольку препроцессор работает до enum s, поэтому факт, что HE и WO - enum, ничего не изменяет.

+0

Я в замешательстве об этом: поскольку 'HE' является перечислением, должен ли' HE' переводить на '0'? –

+0

@ LidongGuo Нет, как упоминалось, 'enum' не играет никакой роли. Препроцессор принимает термин 'print' и вставляет его на' HE' для создания 'printHE', который является именем функции. – trojanfoe

+0

@LidongGuo Это очень хороший вопрос, см. Редактирование. – dasblinkenlight

0

Это escape-последовательность в вашем выражении. Он объединяет самые левые и самые правые, чтобы создать токен.

## является лексема оператор оклейки

0

На моем компьютере, он не работает правильно. Ошибка печати, как показано ниже:

two_sharp.c :(текст + 0x3a.): Не определено ссылкой на PRINT' two_sharp.c:(.text+0x46): undefined reference to PRINT» collect2: л.д. возвращается статус 1 выхода