An Intro to C for Windows

  1. int __cdecl
int __cdecl myFunction(int a, int b);

int __cdecl 是在函数声明中指定函数使用 C 调用约定的一种方式。

  • int:表示函数的返回类型为整数型。
  • __cdecl:是一种调用约定,它指定函数参数从右向左入栈,由调用方清理堆栈的方式。

在 C 和 C++ 中,默认的调用约定通常是 __cdecl。因此,即使不显式地指定 __cdecl,函数也会默认采用这种调用约定。在一些情况下,特别是在 Windows 平台上,显式地声明函数采用 __cdecl 调用约定可以增加代码的可读性和可移植性,尤其是在与其他语言或者在动态链接库(DLL)中进行交互时。

因此,int __cdecl 意味着函数返回一个整数值,并使用 __cdecl 调用约定。

  1. #ifdef
typedef struct _STRING_EX
{
    USHORT Length;
    USHORT MaximumLength;
#ifdef UNICODE
    PWSTER Buffer;
#else 
    PSTR Buffer;
#endif

} STRING_EX, *PSTRING_EX;

这段代码定义了一个名为 STRING_EX 的结构体,用于表示一个字符串。它包含了字符串的长度、最大长度以及指向字符串缓冲区的指针。

具体来说:

  • Length:是一个无符号短整型 (USHORT),表示字符串的实际长度。
  • MaximumLength:也是一个无符号短整型 (USHORT),表示字符串缓冲区的最大容量。
  • Buffer:是一个指针,根据是否定义了 UNICODE 宏,可以是指向宽字符 (PWCHAR) 或者窄字符 (PCHAR) 的指针。

这个结构体的设计允许在不同的字符集下使用不同的字符串类型,当定义了 UNICODE 宏时,Buffer 将会是一个指向宽字符的指针;否则,它将会是一个指向窄字符的指针。

最后,STRING_EX 被定义为 struct _STRING_EX 的别名,同时定义了一个指向 STRING_EX 结构体的指针类型 PSTRING_EX

  1. PTSTR和__T()
PTSTR s = __T("HELLO");

PTSTR 是一个宏定义,通常在 Windows 平台的 C 或 C++ 代码中使用。它是指向 TCHAR 类型(即字符类型的泛型)的指针,根据编译器设置的字符集,TCHAR 可以是 char 或 wchar_t 类型。

__T() 也是一个宏定义,它用于在不同字符集(ANSI 或 Unicode)之间进行转换。如果在代码中使用了 UNICODE 宏定义(或者 _UNICODE 宏定义),则 __T() 会将字符串转换为宽字符(wchar_t),否则它会保持字符串不变。

因此,PTSTR s = __T("HELLO"); 的含义如下:

  • 如果在编译时定义了 UNICODE 宏(或者 _UNICODE 宏),那么 s 将被定义为指向宽字符(wchar_t)的指针,并指向一个包含字符串 “HELLO” 的宽字符数组。
  • 如果没有定义 UNICODE 宏(或者 _UNICODE 宏),那么 s 将被定义为指向字符(char)的指针,并指向一个包含字符串 “HELLO” 的字符数组。

这种方式可以使代码在不同的字符集设置下保持兼容性,同时支持 ANSI 和 Unicode 字符串。 (项目->工程的属性->高级->字符集) 4. void WINAPI void WINAPI 是函数声明中的一部分,它指定了函数的返回类型和调用约定。

  • void 表示函数不返回任何值。这意味着该函数执行完毕后不会返回任何数据给调用方。
  • WINAPI 是一种调用约定,它指定了函数参数从右向左入栈,由调用方清理堆栈的方式。在 Windows 平台上,WINAPI 调用约定通常用于声明 Windows API 函数。

因此,void WINAPI 声明的函数是一个不返回值的 Windows API 函数。这样的函数通常用于执行某些操作而不需要返回结果给调用方,比如执行系统级别的任务或者修改系统状态。

  1. IN _IN_ 是一种通常用于函数参数声明的标记,用于指示参数是一个输入参数。这种标记通常在函数声明中与参数一起使用,以便更清晰地表明参数的用途。

例如,考虑以下函数声明:

void SomeFunction(_IN_ int inputParam);

在这个声明中,_IN_ 标记指示参数 inputParam 是一个输入参数。这意味着在调用 SomeFunction 函数时,它不会修改 inputParam 的值,而是只使用它作为输入来执行某些操作。

_IN_ 是一种约定俗成的标记,不是 C 或 C++ 标准中定义的,它的作用主要是为了提高代码的可读性和可维护性。通常,这种标记可能会与其他标记一起使用,例如 _OUT_ 用于指示输出参数。

Licensed under CC BY-NC-SA 4.0