Win32 派对我来晚了,这里有一大堆函数,例如 _tprintf
、TEXT()
,还有像 strsafe.h 这样的库
具有 StringCchCopy()
、StringCchLength()
等函数。基本上,Win32 API 在 C 之上引入了一堆额外的函数和类型这可能会让不常使用 Win32 的 C 程序员感到困惑。 我在 MSDN 上找到这些类型和函数的定义没有问题。但是,我确实无法找到有关何时以及为何应使用它们的指南。
我有两个问题:
在使用 Win32 编程时,使用 Microsoft 在标准 C 之上提供的所有这些类型和特殊函数有多重要?取消所有标准 C 函数和类型并完全使用 Microsoft 包装器是否被认为是好的做法?
可以将标准 C 函数与这些 Microsoft 类型和函数混合使用吗?例如,使用
malloc()
而不是HeapAlloc()
,或者使用printf()
而不是_tprintf()
等等...?
我有一本 Charles Petzold 的 Programming Windows Fifth Edition 一书,但它主要涵盖了 GUI 的内容,而不是 API 的很多其余部分。
最佳答案
这里实际上有 3 个问题,一个是您明确提出的,另一个是您没有提出的。让我们先解决最后一个问题,因为它往往会引起最大的困惑:
Microsoft 提供的 CRT 提供的 _t
扩展是什么?
它们是 generic-text mappings , 引入是为了可以编写针对基于 ANSI 的系统 (Win9x) 和基于 Unicode 的系统 (Windows NT) 的代码。它们是基于 _UNICODE
和 _MBCS
预处理器符号扩展为实际函数调用的宏。例如,符号 _tprintf
扩展为 printf
或 wprintf
。
同样,Windows API 提供 API 调用的 ANSI 和 Unicode 版本。它们也是扩展为实际 API 调用的预处理器宏,具体取决于预处理器符号 UNICODE
。例如,CreateFile
符号扩展为 CreateFileA
或 CreateFileW
。
在过去的二十年里,通用文本映射没有用处。现在,只需使用 Unicode 版本的 CRT 和 API 调用(例如 wprintf
和 CreateFileW
)。您也可以定义 _UNICODE
和 UNICODE
以确保您不会不小心调用 ANSI 版本。
there are also libraries like
strsafe.h
which have such functions likeStringCchCopy()
,StringCchLength()
这些是 CRT 字符串操作调用的安全变体。它们比例如更安全strcpy
通过提供目标缓冲区大小,类似于 strncpy
.然而,后者有一个尴尬的设计决定,导致目标缓冲区不以零终止,以防源不适合。 StringCchCopy
将始终以零终止目标缓冲区,从而为 CRT 实现提供额外的安全性。 (注意:C11 引入了安全变体,例如 strncpy_s
,如果输入有效,它将始终以零终止目标数组。它们还验证输入,在验证失败时调用当前安装的约束处理程序,从而提供比 strsafe.h 实现更强大的安全性。边界检查实现是 conditional feature of C11。)
How important is it to use all of these types and special functions which Microsoft has provided on top of standard C when programming with Win32? Is it considered good practice to do away with all standard C functions and types and use entirely Microsoft wrappers?
一点都不重要。您可以使用更适合您的方案的任何一个。如果有疑问,通常最好编写可移植(即标准 C)代码。如果您需要 Windows API 调用提供的额外控制(例如,HeapAlloc
比 malloc
允许更多的分配控制;同样 CreateFile
提供了比 fopen
更多的选项。
Is it okay to mix standard C functions in with these Microsoft types and functions? For example, to use
malloc()
instead ofHeapAlloc()
, or to useprintf()
instead of_tprintf()
and etc...?
一般来说,是的,只要你匹配那些调用:HeapFree
你HeapAlloc
,free
你malloc
。例如,您不能混合使用 HeapAlloc
和 free
。如果 Windows API 调用需要使用特殊的内存管理函数,文档中会明确指出。例如,如果 FormatMessage请求分配缓冲区以返回数据,必须使用 LocalFree
释放它。如果您不请求 API 分配缓冲区,您可以传入以任何您喜欢的方式分配的缓冲区(malloc
、HeapAlloc
、IMalloc::Alloc
等)。
关于c - 什么时候应该使用 Win32/WinAPI 类型与标准 C 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48366780/