Предварительная обработка конкатенации строк - PullRequest
0 голосов
/ 10 мая 2019

Я хотел бы объединить 3 следующие строки для получения хороших результатов отладки, используя std :: setw () после.

__ FILENAME__, ":" и LINE

#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)

#define AT __FILENAME__ ":" __LINE__

#ifdef DEBUG
    #ifdef VERBOSE
       #define printDebug(x) std::cout << AT << x << std::flush
    #else
       #define printDebug(x) std::cout << x << std::flush
    #endif
#else
    #define printDebug(x)
#endif

Но на самом деле я получаю ошибки о том, что ";"поле отсутствует перед ":".У кого-нибудь есть идея?

Я на самом деле вызываю функцию printDebug () следующим образом:

printDebug("[SUCCESS] Receiving Message");

1 Ответ

2 голосов
/ 10 мая 2019

Вы можете объединить строковые литералы , поместив их рядом друг с другом.

":" - строковый литерал.

__LINE__ расширяется до числового литерала, а не строки.

__FILENAME__ не расширяется до литерала вообще. Расширяется до выражения.

Есть способ получить строковый литерал из __LINE__, но вы не можете сделать __FILENAME__ строковым литералом.


Вам не нужно здесь использовать буквальную конкатенацию. Вы можете просто сделать это:

#ifdef VERBOSE
#define printDebug(x) std::cout << __FILENAME__ << ":" << __LINE__ << x << std::flush
...