У нас есть кроссплатформенный код, который использует широкие строки.Все наши строковые константы являются широкими строками, и нам нужно использовать CFSTR () для некоторых из них.Мы используем эти макросы, чтобы избавиться от L из широких строк:
// 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))
);
Есть идеи?