2015-08-14 4 views
1

Я пытаюсь сделать Макроподстановки, но он не работает, вот код:C препроцессор макроподстановка

#define COMLOG  2 
#define __COM_ESPECIAL_print(__a, __comNumber) COM##__comNumber##_print(__a) 
#define COM_LOG_print(__a)  __COM_ESPECIAL_print(__a, COMLOG) 

, но когда я пытаюсь позвонить с:

COM_LOG_print("pepe"); 

Это делает нон ожидаемую замену:

неопределенную ссылку на COMCOMLOG_print

То, что я надеюсь получить:

COM2_print 

Любые идеи?

+3

Unrelated к вашей проблеме, но не имеют имена с двойным подчеркиванием ведущего, [они защищены во всех областях] (http://stackoverflow.com/a/228797/440558). –

+1

Взгляните на http://stackoverflow.com/questions/1489932/how-to-concatenate-twice-with-the-c-preprocessor-and-expand-a-macro-as-in-arg, а также http : //stackoverflow.com/questions/2202147/is-there-a-way-to-control-macro-expansion-order, а также http://stackoverflow.com/questions/8587965/c-pre-processor-macro -expansion –

+0

@JoachimPileborg Сначала я положил только на подчеркивание, но тестировал его. Я перехожу только на два, чтобы проверить ... Я забыл вернуть его только одному – togarha

ответ

3

Вам нужен один дополнительный макрос для расширения __comNumber параметра:

#define __COM_ESPECIAL_print_EXP(__a, __comNumber) COM##__comNumber##_print(__a) 

Причиной этого является ## оператора (так же, как #) не расширяют свои аргументы.

полный пример может выглядеть следующим образом:

#include <stdio.h> 

#define COMLOG  2 
#define __COM_ESPECIAL_print_EXP(__a, __comNumber) COM##__comNumber##_print(__a) 
#define __COM_ESPECIAL_print(__a, __comNumber) __COM_ESPECIAL_print_EXP(__a, __comNumber) 
#define COM_LOG_print(__a)  __COM_ESPECIAL_print(__a, COMLOG) 

void COM2_print(const char *s) 
{ 
    printf("%s\n", s); 
} 

int main(void) 
{ 
    COM_LOG_print("pepe"); 
    return 0; 
} 

Выход:

pepe 
+0

Хорошо, мне нужен еще один шаг, я думаю, что этого достаточно с заменой на 2, но ему нужно 3, спасибо много – togarha

Смежные вопросы