也许有人可以向我解释一下:
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));
在这种情况下,它的工作正确。
答案 0 :(得分:5)
条件运算符将其第二个和第三个参数转换为两个参数共有的类型。我不知道CString
的详细信息,所以这只是猜测,但看起来条件运算符会将NULL
转换为CString
以匹配第三个参数的类型,并通过对LPCTSTR
的隐式转换将其传递给函数。
答案 1 :(得分:5)
这是因为需要将第二个和第三个操作数转换为通用类型 (结果不能有不同的类型,具体取决于条件是否为真。)
第一个参数相当于
str.IsEmpty() ? CString(NULL) : str
因为NULL
没有将CString
转换为。的类型
CString(NULL)
构造一个空的CString
。
第二个相当于
str.IsEmpty() ? strNull : (LPCTSTR) str
因为CString
可以转换为LPCTSTR
而不是相反。
内联演员,
str.IsEmpty() ? (LPCTSTR) NULL : str
应该与第二种产生相同的效果。
答案 2 :(得分:1)
乍一看,我想象
Func1((str.IsEmpty() ? (LPCTSTR)NULL : str));
也会起作用,如果确实如此,你可能会遇到由
修复的类型转换问题LPCTSTR strNull = NULL;
赋值,因为稍后调用LPCTSTR
时,它会将类型strNull
与null相关联。