你怎么知道结构中的某些字段是数组?

How do you know that some fields in structs are arrays?

我正在查看 Microsoft wincrypt.h 头文件中的这段 C 代码

//+-------------------------------------------------------------------------
//  Attributes
//
//  Where the Value's PATTR_BLOBs are in their encoded representation.
//--------------------------------------------------------------------------
// certenrolls_begin -- CRYPT_ATTRIBUTE
typedef struct _CRYPT_ATTRIBUTE {
    LPSTR               pszObjId;
    DWORD               cValue;
    PCRYPT_ATTR_BLOB    rgValue;
} CRYPT_ATTRIBUTE, *PCRYPT_ATTRIBUTE;

typedef struct _CRYPT_ATTRIBUTES {
    DWORD                cAttr;
    PCRYPT_ATTRIBUTE     rgAttr;
} CRYPT_ATTRIBUTES, *PCRYPT_ATTRIBUTES;
// certenrolls_end

我是 运行 这个例子 How To Get Information from Authenticode Signed Executables。我可以在代码中看到 rgValuergAttr 都作为数组访问,例如

pSignerInfo->AuthAttrs.rgAttr[n].rgValue[0].pbData,
pSignerInfo->AuthAttrs.rgAttr[n].rgValue[0].cbData,

如果我没有看到这个例子,我永远不会明白这个。是 Windows 特定的东西还是我对 C 中的结构和类型声明一无所知?

rgAttrrgValue 是指向 struct 的指针类型:

typedef struct _CRYPT_ATTRIBUTES *PCRYPT_ATTRIBUTES;
typedef struct _CRYPT_ATTRIBUTE *PCRYPT_ATTRIBUTE;

现在,当您执行 PCRYPT_ATTRIBUTE rgAttr 时,它将等同于 struct _CRYPT_ATTRIBUTE *rgAttrCRYPT_ATTRIBUTE *rgAttr

一般来说,在 pointers 上使用 typedef 只有缺点。 pointer 上的 typedef 实际上有用的唯一情况是指针是函数指针。

PCRYPT_ATTR_BLOBCRYPT_ATTR_BLOB*,指向 CRYPT_ATTR_BLOB 的指针。这可以是指向单个值的指针,也可以是指向数组的指针。您无法从类型声明中分辨出来,必须阅读文档。

documentation 说:

cValue

A DWORD value that indicates the number of elements in the rgValue array.

rgValue

Pointer to an array of CRYPT_INTEGER_BLOB structures.

所以在这种情况下 rgValue 是一个指向数组的指针。

请注意,MS 在匈牙利风格的名称修饰中非常稳定,"rg" 前缀告诉您它是一个数组,即使不查看文档也是如此。