1

私はMacOS用のアプリを開発しています。これには、C++のクロスプラットフォームライブラリが含まれています。次のように定義されたマクロがあります。

#define MY_GET(DataType,DataName,PtrFunName,DefaultVaule) \
DataType Get##DataName() \
{ \
    DataType dataTem = (DefaultVaule);\
    if (NULL == p) \
    { \
        return dataTem; \
    } \
    p->Get##PtrFunName(CComBSTR(L#DataName),&dataTem); \
    return dataTem; \
}

コンパイル時に、コンパイラは次のエラーを生成します。

Use of undeclared identifier 'L'

これはマクロ「MY_GET」から展開されます。を検索した後CComBSTR(L、L"String"の他の使用法を見つけることができます。それで、他のマクロが正常にコンパイルされているのに、なぜL私のマクロからの展開が未定義なのですか。L

L "String"はObjective-Cで合法ですか?

4

1 に答える 1

3

ここにプリプロセッサの「トークン連結」演算子が必要なようです##

CComBSTR(L ## #DataName)

それ以外の

CComBSTR(L#DataName)

Objective-C ファイル内の次のコードは、コンパイルしてwchar_t文字列を生成しますL"abc"

#define LL(x) L ## #x
wchar_t *s = LL(abc); // expands to: L"abc"

他のコンパイラの動作が異なるかどうかはわかりませんが、Apple LLVM 4.1 コンパイラではLと文字列の間にスペースを入れることはできません:

#define LL(x) L#x
wchar_t *s = LL(abc); // expands to: L "abc"
// error: use of undeclared identifier 'L'
于 2013-01-04T06:16:05.890 に答える