1

我注意到以下陈述:

  __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)?就像我上面的陈述一样。

4

3 回答 3

1

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

NTDSAPI
void
WINAPI
DsFreeSpnArrayA(
    __in DWORD cSpn,
    __deref_in_ecount(cSpn) LPSTR *rpszSpn
    );
于 2012-06-02T14:51:24.267 回答
1

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

或者它可以是你,你决定标题对于项目来说是如此核心,以至于你使用下划线来避免与其余代码的名称冲突。错误的决定,但很常见。

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

于 2012-06-02T13:41:12.930 回答
0

注意那些不是语句,它们是参数声明。

所有以双下划线或单下划线后跟大写字母开头的名称都保留用于实现,即编译器、标准库和操作系统。这确保了如果用户定义了名为“in”的宏或全局变量,它不会破坏标准库,因为它使用 __in,并且用户和第三方库决不能使用这样的名称定义任何东西,所以 sal.h 的作者是行为良好且不使用保留名称。

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

于 2012-06-02T12:56:10.013 回答