C++中方括号内双点的含义是什么?

17

在文件C:\Program Files (x86)\Windows Kits\8.1\Include\um\OleAuto.h中,我发现以下代码,但我不知道如何解释:

WINOLEAUTAPI SafeArrayAccessData(_In_ SAFEARRAY * psa,
_Outptr_result_buffer_(_Inexpressible_(psa->cbElements * 
product(psa->rgsabound[0..psa->cDims-1]->cElements))) 
void HUGEP** ppvData);

请注意方括号内的双点号。这是C++中的一个新运算符吗?


这似乎是 SAL 表达式和可能未记录的编译器内部函数的扭曲组合。 - gd1
这里确实没有列出来:http://en.cppreference.com/w/cpp/language/operator_precedence。不过除此之外,这个网站还是相当详尽的。 - TeaOverflow
4
我打赌 _Outptr_result_buffer_ 是一个宏,并且该参数从未被编译器看到。(如果编译器看到了,它将被拒绝并报错。) - Keith Thompson
1
@KeithThompson 是正确的。在正常编译中,_Outptr_result_buffer_ 最终会扩展为空。该宏由静态分析工具使用。 - Raymond Chen
1个回答

19

这似乎是一个SAL注释,用于告诉静态分析器缓冲区的大小太复杂,无法使用普通注释来表示:

https://msdn.microsoft.com/en-us/library/jj159527.aspx

它不一定包含有效的语法,但其中包含的内容可能旨在简洁地说明如何计算缓冲区的大小。

如果我要自己解释它,我想它的意思是以下代码将产生什么结果:

DWORD CalculateInexpressibleSafeArrayDataSize(SAFEARRAY * psa)
{
    DWORD cbSize = psa->cbElements;
    for (int i = 0; i < psa->cDims; i++) // product()
        cbSize *= psa->rgsabound[i]->cElements;
    return cbSize;
}

10
SAL的目的是“减少C++缺陷”。通过在几乎没有文档记录的内部函数中写入无意义的内容来实现。 - gd1
@gd1:我的猜测是,在该函数原型和实现之后很长一段时间才添加了SAL,然后由于向后兼容性要求,无法更改或删除函数的原型。总的来说,SAL确实非常出色,如果您发现自己代码中的声明无法合理地标记为SAL,那就说明您应该重新考虑您所做的事情。 - Johann Gerell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接