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

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


person Saher Ahwal    schedule 15.12.2014    source источник


Ответы (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__, потому что он расширяется до вызова функции, а не литерала.

person Mark Ransom    schedule 15.12.2014
comment
задолго до того, как я использовал __FILEW__ из-за широкой строки - person Saher Ahwal; 16.12.2014
comment
@Saher, это не имеет значения, они оба оцениваются как строковые литералы. Просто разные струны. - person Mark Ransom; 16.12.2014
comment
так как заставить это работать __FILE_NAME_ONLY__(__FILE__) не решил - person Saher Ahwal; 16.12.2014
comment
@Saher преобразует строки в wstring и использует оператор конкатенации +. - person Mark Ransom; 16.12.2014
comment
хммм, я думаю, что это должно работать как-то без этого преобразования. То, что у меня есть выше, является примером. Я использую/объединяю многие другие значения, которые отлично работают, и теперь мне нужно все преобразовать. Я предпочитаю просто заставить это работать, если это возможно - person Saher Ahwal; 16.12.2014
comment
@Saher, то, что ты думаешь, не имеет значения. Я рассказал вам, почему это не работает, и дал вам предложение заставить это работать. Вы можете не верить мне, но удачи в получении лучшего ответа. - person Mark Ransom; 16.12.2014
comment
Я думаю, мой вопрос в том, почему _WIDE(__FILEW_) работает, а __FILE_NAME_ONLY(__FILE__) нет? они похожи на меня, оба являются вызовами функций. - person Saher Ahwal; 16.12.2014
comment
@Saher _WIDE() - это не вызов функции, это другой макрос. Правила для макросов полностью отличаются от правил для функций. - person Mark Ransom; 16.12.2014

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

__BASE_FILE__

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

person Jay    schedule 15.12.2014
comment
+1 для сброса с -1 балла. Не самый лучший ответ в мире (например, 42), но это неплохо - некоторым пользователям GCC, использующим Windows, это может помочь. - person Prof. Falken; 08.06.2015
comment
Приятно осознавать, что помощь людям — это не конкурс популярности ;) - person Jay; 08.06.2015