Конкатенация макросов c ++ не работает в gcc - PullRequest
1 голос
/ 27 сентября 2011
#include <iostream>
void LOG_TRACE() { std::cout << "reach here"; }

#define LOG_LL_TRACE    LOG_TRACE
#define LL_TRACE    0
#define __LOG(level)  LOG_##level()
#define LOG(level) __LOG(##level)

int main()
{
    LOG(LL_TRACE);
    return 0;
}

Код работает в Visual Studio, но report: test.cpp: 13: 1: error: вставка "(" и "LL_TRACE" не дает действительный токен предварительной обработки.

Какя могу это исправить?

ps: предполагается, что расширение макроса будет LOG (LL_TRACE) -> __LOG (LL_TRACE) -> LOG_LL_TRACE ().

ps: предположим, что LL_TRACE должен иметьзначение 0, не удаляйте его.

Ответы [ 2 ]

4 голосов
/ 27 сентября 2011

Две вещи делают этот код не компилируемым на g ++: Во-первых, ошибка, которую вы цитируете, заключается в том, что вы хотите получить следующее:

#define LOG(level) __LOG(level)

Уведомление № ##. Эти хеш-метки означают сцепление, но вы ничего не объединяете. Просто переадресация аргумента.

Вторая ошибка заключается в том, что вы должны удалить

#define LL_TRACE    0

Эта строка означает, что вы в конечном итоге вызываете LOG (0), который расширяется до LOG_0, который не определен.

1 голос
/ 27 сентября 2011

Не должно ли быть:

#define LOG(level) __LOG(level)

Это работает:

#include <iostream>
void LOG_TRACE() { std::cout << "reach here"; }
#define LOG_LL_TRACE    LOG_TRACE
#define __LOG( level ) LOG_##level()                                                    
#define LOG(level) __LOG(level)

int main()
{
        LOG( LL_TRACE );                                     
        return 0;                                                           
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...