Базовое имя файла из __FILE__

Мне нужно имя файла только там, где __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

что мне не хватает? Спасибо

2 ответа

Решение

Вы зависите от конкатенации строковых литералов, за исключением того, что все термины не являются строковыми литералами.

Я предполагаю, что вы ранее делали это так:

#define MY_TRACE( mask, format, ... )  \            
            GlobalTrace( mask, L"-[" __FILE__ L":" format , __VA_ARGS__ ) 

Если __FILE__ а также format разверните до строкового литерала, 4 строки будут вставлены в одну. "A" "B" "C" "D" такой же как "ABCD",

Этого не происходит, когда вы заменяете __FILE_NAME_ONLY__ потому что он расширяется до вызова функции, а не литерала.

Если вы используете gcc, этот макрос должен помочь:

__BASE_FILE__

Вот полезный список

Другие вопросы по тегам