gpt4 book ai didi

c - 什么时候应该使用 Win32/WinAPI 类型与标准 C 类型?

转载 作者:可可西里 更新时间:2023-11-01 13:28:31 25 4
gpt4 key购买 nike

Win32 派对我来晚了,这里有一大堆函数,例如 _tprintfTEXT(),还有像 strsafe.h 这样的库 具有 StringCchCopy()StringCchLength() 等函数。基本上,Win32 API 在 C 之上引入了一堆额外的函数和类型这可能会让不常使用 Win32 的 C 程序员感到困惑。 我在 MSDN 上找到这些类型和函数的定义没有问题。但是,我确实无法找到有关何时以及为何应使用它们的指南。

我有两个问题:

  1. 在使用 Win32 编程时,使用 Microsoft 在标准 C 之上提供的所有这些类型和特殊函数有多重要?取消所有标准 C 函数和类型并完全使用 Microsoft 包装器是否被认为是好的做法?

  2. 可以将标准 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扩展为 printfwprintf

同样,Windows API 提供 API 调用的 ANSI 和 Unicode 版本。它们也是扩展为实际 API 调用的预处理器宏,具体取决于预处理器符号 UNICODE。例如,CreateFile符号扩展为 CreateFileACreateFileW

在过去的二十年里,通用文本映射没有用处。现在,只需使用 Unicode 版本的 CRT 和 API 调用(例如 wprintfCreateFileW)。您也可以定义 _UNICODEUNICODE 以确保您不会不小心调用 ANSI 版本。

there are also libraries like strsafe.h which have such functions like StringCchCopy(), 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 调用提供的额外控制(例如,HeapAllocmalloc 允许更多的分配控制;同样 CreateFile 提供了比 fopen 更多的选项。

Is it okay to mix standard C functions in with these Microsoft types and functions? For example, to use malloc() instead of HeapAlloc(), or to use printf() instead of _tprintf() and etc...?

一般来说,是的,只要你匹配那些调用:HeapFreeHeapAllocfreemalloc。例如,您不能混合使用 HeapAllocfree。如果 Windows API 调用需要使用特殊的内存管理函数,文档中会明确指出。例如,如果 FormatMessage请求分配缓冲区以返回数据,必须使用 LocalFree 释放它。如果您不请求 API 分配缓冲区,您可以传入以任何您喜欢的方式分配的缓冲区(mallocHeapAllocIMalloc::Alloc 等)。

关于c - 什么时候应该使用 Win32/WinAPI 类型与标准 C 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48366780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com