2014-12-15 2 views
0

__FILE____FILEW__ 매크로가 전체 경로를 반환하는 경우에만 파일 이름이 필요합니다.__FILE__의 기본 파일 이름

#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 MY_TRACE(mask, format, ...) \    
       GlobalTrace(mask, L"-[" _WIDE(__FILE_NAME_ONLY__) L":" format , __VA_ARGS__) 

을 다음과 같이

#define __WIDE(_String) L ## _String 
#define _WIDE(_String) __WIDE(_String) 

를 내가 얻을 : 오류 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__으로 바꾸면 함수 호출이 아닌 리터럴로 확장되므로이 문제가 발생하지 않습니다.

+0

넓은 문자열 –

+0

때문에 '__FILEW__'을 사용하기 훨씬 전에 @Saher 상관 없습니다. 둘 다 문자열 리터럴로 평가됩니다. 문자열의 다른 종류. –

+0

그래서'__FILE_NAME_ONLY __ (__ FILE __)'을 해결하지 못했다면 –

0

는 GCC를 사용하는 경우이 매크로는 데 도움이 될 것입니다 용어의 모든 문자열이있는 것을 제외하고

__BASE_FILE__ 

여기, 당신은 문자열 리터럴 연결에 따라있어 도움이 list

+0

gcc를 사용하지 않습니다. +1 점을 +1하여 +1 –

+0

+1을 고맙게 생각합니다. 세상에서 가장 위대한 대답은 아니지만 ("* 42 *"와 같지만) 나쁘지 않습니다. Windows 사용자를 사용하는 일부 GCC가 도움을받을 수 있습니다. –

+0

도움이되는 사람이 인기 콘테스트가 아님을 알고 있으면 좋음) – Jay