1

我正在为 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的却是成功编译的。

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 回答