базовое имя файла из __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

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

0

Решение

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

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

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

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

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

2

Другие решения

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

__BASE_FILE__

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

0

По вопросам рекламы [email protected]