问题描述
代码如下:
'''
int __stdcall xloper_type(const xloper *type){
if(type->xltype&~(xlbitXLFree|xlbitDLLFree)==xltypeRef)
return xltypeRef;
}
'''
为什么在测试指针类型的 xltype 时使用 ~(xlbitXLFree|xlbitDLLFree)??谢谢!
解决方法
以下是 xlcall.h 中定义 XLOPER 数据类型的相关部分。我不知道 OP 的代码(无论是 XLOPER 还是 XLOPER12)中如何定义“xloper”(小写),但对于 XLOPER,xltype 成员是一个无符号整数(WORD)。每个位对应一个不同的标志,因此您可以使用按位运算。
xlbitXLFree 和 xlbitDLLFree 是指示谁(Excel 或您)负责清理分配给 OPER 的任何内存(例如,如果它包含字符串或数组)的位。因此,通常情况下,如果您为 xll 中的 OPER 分配任何内存,则 xlbitDLLFree 位将被设置为 1,并且 Excel 会希望您在之后进行整理(将 OPER 传递给应在您的某个位置声明的 xlAutoFree() 函数) xll 代码).
所以
type->xltype&~(xlbitXLFree|xlbitDLLFree)
在按位 AND NOT() 操作中将内存分配位清零,只留下基本类型。例如,如果你从 Excel 接收到一个字符串到你的代码中,它的 xltype 很可能是 xltypeStr & xlbitXLFree(Excel 会整理),所以 0x1002,它不等于 xltypeStr (0x0002),因此需要在之前进行逐位运算您检查 OPER 基础类型。
一种更简洁的编写方式可能是(取决于需求)
if(type->xltype & xltypeRef) {}
因为如果匹配 xltypeRef (0x0008) 的位在 type->xltype 中设置,则结果将为非零 (true)。
/*
** XLOPER and XLOPER12 data types
**
** Used for xltype field of XLOPER and XLOPER12 structures
*/
#define xltypeNum 0x0001
#define xltypeStr 0x0002
#define xltypeBool 0x0004
#define xltypeRef 0x0008
#define xltypeErr 0x0010
#define xltypeFlow 0x0020
#define xltypeMulti 0x0040
#define xltypeMissing 0x0080
#define xltypeNil 0x0100
#define xltypeSRef 0x0400
#define xltypeInt 0x0800
#define xlbitXLFree 0x1000
#define xlbitDLLFree 0x4000