sal缓冲区注释的额外下划线(_)是什么?

时间:2012-06-02 12:39:11

标签: c++ visual-c++ c++11 visual-c++-2010

我注意到这样的陈述:

  __in HMODULE Module,
  __in PSTR ImportedModuleName,
  __in PSTR ImportedProcName,
  __in PVOID AlternateProc,
  __out_opt PVOID *OldProc

在这些陈述中,我看到两个_ _然后是单词(in)。

好吧,在查看sal.h时,我注意到了已弃用的注释:

// sal.h  
_in    : The function will only read from the buffer. The
caller must provide the buffer and initialize it. Cannot be used with _deref.

那么只有一个下划线。我想知道为什么我在网上看到的所有源代码都有两个下划线(_ _ in)?就像我上面的陈述一样。

3 个答案:

答案 0 :(得分:1)

当您拥有不支持命名空间的语言(C)或编译器功能(预处理器)时,这是军备竞赛的结果。或者在语言中添加非标准关键字,例如__declspec__attribute__。以_underscore开头的标识符名称保留给实现者。不幸的是,戴帽子的人不止一个人。实现者可以是编写编译器及其CRT实现的程序员。或者它可以是编写核心库的程序员,如sal.h。

或者它可能是你,你决定一个标题是项目的核心,你使用下划线来避免名称与其余代码冲突。错误的决定,但非常普遍。

强制实现者使用多个下划线来避免名称冲突。

答案 1 :(得分:1)

_in你在sal.h注意到注释是可能的注释部分之一。整个注释从另一个下划线开始。请参阅以下示例:

NTDSAPI
void
WINAPI
DsFreeSpnArrayA(
    __in DWORD cSpn,
    __deref_in_ecount(cSpn) LPSTR *rpszSpn
    );

答案 2 :(得分:0)

N.B。那些不是陈述,它们是参数声明。

所有以双下划线或单下划线开头,后跟大写字母的名称都保留用于实现,即编译器,标准库和操作系统。这确保了如果用户定义称为“in”的宏或全局变量,它将不会破坏std lib,因为它使用__in,并且用户和第三方库必须从不定义具有此类名称的任何内容,因此sal.h的作者表现良好,不使用保留名称。

您正在查看的双下划线标识符是Microsoft指示参数是否仅用于将值传递给函数的方式,或者它是否还将数据传回(即在指针中设置的指针或引用参数)功能)或两者。 Icm惊讶所有你在网上看到的代码都有它们,你只能看看Windows代码,甚至只能在MSDN上看?