2011-03-20 82 views
8

我想知道在C++中进行Windows开发时使用注释是否重要?例如,Windows SDK参数注释

#include <windows.h> 
int WINAPI WinMain(
    __in HINSTANCE hInstance, 
    __in HINSTANCE hPrevInstance, 
    __in LPSTR lpCmdLine, 
    __in int nCmdShow 
){ 
    return 0; 
} 

这可以写成:

#include <windows.h> 
int WinMain(
    HINSTANCE hInstance, 
    HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, 
    int nCmdShow 
){ 
    return 0; 
} 

什么我不使用他们失去?我很难搞清楚这些是为了什么,似乎没有任何为凡人写的指南。

+0

您应该编辑标题,'__in'与调用约定无关。调用约定('__stdcall','__fastcall','__cdecl')一次适用于所有参数。 – 2011-03-20 09:33:01

回答

6

您必须使用旧版本的SDK。 7.0版声明的参数是这样的:

WinMain (
    __in HINSTANCE hInstance, 
    __in_opt HINSTANCE hPrevInstance, 
    __in LPSTR lpCmdLine, 
    __in int nShowCmd 
    ); 

注意__in_opt注解,它标志着参数为可选,表明传递NULL是可以接受的。这些是SAL注释的早期版本,是源代码注释语言的首字母缩略词。他们有一个MSDN article,但它记录了在C/C++库#include文件中使用的语法。不太清楚为什么SDK组不使用相同的功能,他们往往有点迟缓。

由于使声明更具可读性,消除了C声明的歧义,注释对工具也很有用。好的例子是VS2008和VS2010的高级SKU中内置的代码分析器(它捕获编程错误)。 P/Invoke Interop Assistant是一个使用从注释的SDK头文件生成的dbase生成C#或VB.NET p/invoke声明的工具。注释对生成良好的C#声明至关重要。

你也可以在你自己的代码中使用这些注释,如果你这样做,代码分析器会自动验证它。请使用MSDN文章中记录的现代语法。我认为所需的sal.h头文件被包含在任何包含CRT头文件的源文件中。

3

注释是添加到您的源代码标记(如__in,__out和__inout),提供开发商和静态分析工具提供有关函数及其参数,及其用途的其他信息。注释类似于添加到代码中的注释,被编译器忽略,但被静态分析工具使用。注释的使用有助于提高开发人员的效率,有助于提高静态分析结果的准确性,并允许工具更好地确定是否存在特定的错误。

来源:http://msdn.microsoft.com/en-us/library/ff550230%28VS.85%29.aspx

关于WINAPI事情看http://unixwiz.net/techtips/win32-callconv.html

3

IIRC的__in__out关键字#define d不了了之。他们只是为了澄清每个参数的目的。 __in参数被设计为被函数读取但未被修改,而__out参数被设计为被函数修改以传回一些返回码。

你能想到的__in作为C++的“通过const引用传递”或和__out“按值传递”的想法“通过非const引用传递”。这不是字面上的意思,但它有相同的内涵。