Мне нужно имя файла только там, где __FILE__
а также __FILEW__
макросы возвращают весь путь.
Я определил следующее:
#define __FILE_NAME_ONLY__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)
Я использую это следующим образом:
#define MY_TRACE( mask, format, ... ) \
GlobalTrace( mask, L"-[" __FILE_NAME_ONLY__ L":" format , __VA_ARGS__ )
Я получаю следующую ошибку:
ошибка C2064: термин не оценивает функцию, принимающую 1 аргумент
и когда я пытаюсь следующие макросы:
#define __WIDE(_String) L ## _String
#define _WIDE(_String) __WIDE(_String)
следующее
#define MY_TRACE( mask, format, ... ) \
GlobalTrace( mask, L"-[" _WIDE(__FILE_NAME_ONLY__) L":" format , __VA_ARGS__ )
Я получил : ошибка C2146: синтаксическая ошибка: отсутствует «)» перед идентификатором «L» когда я на самом деле пытаюсь использовать макрос MY_TRACE
что мне не хватает? Спасибо
Вы зависите от конкатенации строковых литералов, за исключением того, что все термины не являются строковыми литералами.
Я предполагаю, что вы ранее делали это так:
#define MY_TRACE( mask, format, ... ) \
GlobalTrace( mask, L"-[" __FILE__ L":" format , __VA_ARGS__ )
Если __FILE__
а также format
разверните до строкового литерала, 4 строки будут вставлены в одну. "A" "B" "C" "D"
такой же как "ABCD"
,
Этого не происходит, когда вы заменяете __FILE_NAME_ONLY__
потому что он расширяется до вызова функции, а не литерала.