Objective-C中未声明的标识符“L”

时间:2013-01-04 05:13:22

标签: objective-c string macos

我正在为Mac OS开发一个应用程序,其中包括一个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被成功编译。

Objective-C中L“String”是否合法?

1 个答案:

答案 0 :(得分: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'