我注意到这样的陈述:
__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)?就像我上面的陈述一样。
答案 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上看?