函数头中的条件运算符“?:”和 LPCTSTR
Condition operator "?:" and LPCTSTR in function header
也许谁能给我解释一下:
bool Func1(LPCTSTR sData)
{
if (sData) { ... }
}
我这样调用函数:
CString str = _T("");
Func1((str.IsEmpty() ? NULL : str));
而'sData'函数内部永远不会为NULL,它总是空字符串而不是NULL,为什么?
像这样编辑代码:
LPCTSTR strNull = NULL;
Func1((str.IsEmpty() ? strNull : str));
在这种情况下它工作正常。
乍一看,我想
Func1((str.IsEmpty() ? (LPCTSTR)NULL : str));
也可以,如果可以,您可能遇到了类型转换问题,该问题已由
LPCTSTR strNull = NULL;
赋值,因为它会在稍后调用strNull
时将类型LPCTSTR
与null的值相关联。
条件运算符将其第二个和第三个参数转换为它们两个共有的类型。我不知道 CString
的细节,所以这只是一个猜测,但看起来条件运算符将 NULL
转换为 CString
以匹配第三个参数的类型,并通过对 LPCTSTR
的隐式转换将其传递给函数。
这是因为需要将第二个和第三个操作数转换为通用类型。
(根据条件是否为真,结果不能有不同的类型。)
第一个参数相当于
str.IsEmpty() ? CString(NULL) : str
因为 NULL
没有可以将 CString
转换为的类型。
而CString(NULL)
构造了一个空的CString
。
第二个相当于
str.IsEmpty() ? strNull : (LPCTSTR) str
因为 CString
可以转换为 LPCTSTR
但不能反过来。
内联演员,
str.IsEmpty() ? (LPCTSTR) NULL : str
应该和第二个效果一样。
也许谁能给我解释一下:
bool Func1(LPCTSTR sData)
{
if (sData) { ... }
}
我这样调用函数:
CString str = _T("");
Func1((str.IsEmpty() ? NULL : str));
而'sData'函数内部永远不会为NULL,它总是空字符串而不是NULL,为什么? 像这样编辑代码:
LPCTSTR strNull = NULL;
Func1((str.IsEmpty() ? strNull : str));
在这种情况下它工作正常。
乍一看,我想
Func1((str.IsEmpty() ? (LPCTSTR)NULL : str));
也可以,如果可以,您可能遇到了类型转换问题,该问题已由
LPCTSTR strNull = NULL;
赋值,因为它会在稍后调用strNull
时将类型LPCTSTR
与null的值相关联。
条件运算符将其第二个和第三个参数转换为它们两个共有的类型。我不知道 CString
的细节,所以这只是一个猜测,但看起来条件运算符将 NULL
转换为 CString
以匹配第三个参数的类型,并通过对 LPCTSTR
的隐式转换将其传递给函数。
这是因为需要将第二个和第三个操作数转换为通用类型。
(根据条件是否为真,结果不能有不同的类型。)
第一个参数相当于
str.IsEmpty() ? CString(NULL) : str
因为 NULL
没有可以将 CString
转换为的类型。
而CString(NULL)
构造了一个空的CString
。
第二个相当于
str.IsEmpty() ? strNull : (LPCTSTR) str
因为 CString
可以转换为 LPCTSTR
但不能反过来。
内联演员,
str.IsEmpty() ? (LPCTSTR) NULL : str
应该和第二个效果一样。