XCode: конкатенация препроцессора нарушена? - PullRequest
0 голосов
/ 15 сентября 2011

У нас есть кроссплатформенный код, который использует широкие строки.Все наши строковые константы являются широкими строками, и нам нужно использовать 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))
                                            );

Есть идеи?

1 Ответ

1 голос
/ 12 августа 2012

Во время токенизации, которая происходит до языка препроцессора, обрабатываются строковые литералы.Таким образом, L"qm" преобразуется в широкий строковый литерал.Это означает, что вы пытаетесь вставить токен со строковым литералом (а не буквой L), что запрещено C99.

...