我正在为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”是否合法?
答案 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'