19

其中一些预处理器定义位于 WinMain 函数和其他 Windows 库函数中。他们的目的是什么?它们是如何工作的?将它们写入您的实现或函数调用是一种好习惯吗?

我最初的研究表明,它们只是简单地设置为:

#define __in 
#define __out
#define __in_opt

这意味着它们在预处理器通行证上被替换为任何内容。它们只是一种文档方法,没有任何功能吗?

如果是这样,我可以看到像这样记录代码的好处。使用 doxygen 之类的东西,您需要写出两次参数名称。所以这在理论上可以帮助减少重复,并保持一致性......

我没有关于__allowed()应该如何工作的理论。

4

4 回答 4

24

它们是源代码注释语言中的 SAL 注释。微软工具依赖于它。MSDN 库文章在此处。一个很好的例子是代码分析。另一个完全不相关但受这些注释支持的工具是 Pinvoke Interop Assistant。

于 2010-11-21T19:41:01.923 回答
9

SAL 注释对两件事很有用:

  • 通过 PREfast 进行静态分析(使用 /analyze 编译)
  • 人类读者可以查看注释并找出应该如何调用函数,并快速确定输入/输出参数。

当您的代码在分析的情况下编译时,这些宏实际上会扩展为各种 declspec 表达式。我一直在我的代码中使用这些注释。

于 2010-11-21T19:39:08.140 回答
5

它们在 Microsoft 语义分析工具中用作代码标记。除非您打算自己使用此工具,否则使用它们没有什么意义。

于 2010-11-21T19:38:45.220 回答
-3

这些 Microsoft 宏通常会扩展为空,仅作为对读者的提示。

但是,上次我检查例如MessageBox参数的提示是完全错误的,提示第一个、第二个和第三个参数具有有用的默认值(当您指定 0 时),而实际上它是第一个和第四个参数具有有用的默认值。也许还有默认为“错误”的标题参数,但我从未发现它有用。所以,这只是微软的事情,暗示你不能也不应该依赖,只是误导视觉混乱。

干杯&hth.,

于 2010-11-21T19:33:20.287 回答