2012-06-02 51 views
1

我注意到之类的语句:sal缓冲注释中的额外下划线(_)是什么?

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

这些语句中,我看到了两个_再字(中)。

好,一边看着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)?像我上面的陈述。

+0

下划线表示它是一个用于防止名称冲突的保留标识符。尽管如此,我不知道'in'/'out'是什么意思。 – Pubby

+0

可能的重复[为什么人们在C++中使用__(双下划线)](http://stackoverflow.com/questions/224397/why-do-people-use-double-underscore-so-much-in- c) – markus

回答

0

N.B.这些不是语句,它们是参数声明。

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

您正在查看的双下划线标识符是Microsoft指示参数是仅用于将值传递给函数,还是将数据传回的函数(即指向或设置为该功能)或两者。 Icm感到惊讶全部你在网上看到的代码有他们,你只能看着Windows代码,甚至只能在MSDN上?

+0

“sal.h的作者表现得很好,并没有使用保留的名字。” AFAIK,全局范围内以一个下划线开头的名字也被保留。 –

+0

是的,保留名称的列表比我在答案中给出的要复杂得多。我认为引用的评论是记录函数参数,如果不是,它可能不会很好。 –

1

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

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

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

1

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

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