2011-09-15 2 views
0

와이드 문자열을 사용하는 플랫폼 간 코드 조각이 있습니다. 모든 문자열 상수는 넓은 문자열이므로 일부 문자열에 CFSTR()을 사용해야합니다. 다음 매크로를 사용하여 넓은 문자열에서 L을 제거합니다.XCode : 전 처리기 연결이 끊어 졌습니까?

// strip leading L"..." from wide string macros 
// expand macro, e.g. turn WIDE_STRING (#define WIDE_STRING L"...") into L"..." 
# define WIDE2NARROW(WideMacro)  REMOVE_L(WideMacro) 
// L"..." -> REM_L"..." 
# define REMOVE_L(WideString)  REM_##WideString 
// REM_L"..." -> "..." 
# define REM_L 

이 방법은 Windows와 Linux에서 모두 작동합니다. 아니 맥에 - 우리 얻을 다음과 같은 오류 :

“error: pasting "REM_" and "L"qm"" does not give a valid preprocessing token” 

맥 예 :

#define TRANSLATIONS_DIR_BASE_NAME   L"Translations" 
#define TRANSLATIONS_FILE_NAME_EXTENSION  L"qm" 

CFURLRef appUrlRef = CFBundleCopyResourceURL(CFBundleGetMainBundle() 
              , macTranslationFileName 
              , CFSTR(WIDE2NARROW(TRANSLATIONS_FILE_NAME_EXTENSION)) 
              , CFSTR(WIDE2NARROW(TRANSLATIONS_DIR_BASE_NAME)) 
              ); 

어떤 아이디어가?

+0

예제가 완전하지 않은 것 같습니다. 또는 사용 방법이 분명하지 않습니다. 설명하는 오류를 유발하는 코드 전체를 게시 할 수 있습니까? – Lindydancer

+0

약간의 코드를 추가했지만별로 추가하지 않는다고 생각합니다. Mac에서 WIDE2NARROW()를 사용하면 같은 오류 메시지가 나타납니다. –

+0

@Lindydancer 내가 필요한 것은 [ "어떻게 C 전처리기를 사용하여 연결된 문자열을 와이드 문자로 변환합니까?"] (http://stackoverflow.com/questions/2192416/how-to-convert-concatenated-strings-to- wide-char-with-the-c-preprocessor)를 역순으로 사용합니다. –

답변

1

전처리 언어보다 먼저 발생하는 토큰 화 중에 문자열 리터럴이 처리됩니다. 따라서 L"qm"은 넓은 문자열 리터럴로 변환됩니다. 즉, C99에서 금지하는 문자열 리터럴 (문자가 아닌 L)을 사용하여 붙여 넣기를 토큰하려고합니다.