2011-09-15 37 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。無法在Mac - 我們得到以下錯誤:

「error: pasting "REM_" and "L"qm"" does not give a valid preprocessing token」 

的Mac例如:

#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-寬字符與c預處理器)相反。 –

回答

1

在預處理器語言之前發生的標記化過程中,會處理字符串文字。所以L"qm"被轉換爲寬字符串文字。這意味着你正在嘗試使用C99禁止的字符串文字(而不是字母L)進行令牌粘貼。