下面是 SystemTimeToTzSpecificLocalTime 的函数原型:
BOOL SystemTimeToTzSpecificLocalTime(
[in, optional] const TIME_ZONE_INFORMATION *lpTimeZoneInformation,
[in] const SYSTEMTIME *lpUniversalTime,
[out] LPSYSTEMTIME lpLocalTime
);
正如您所看到的,第二个和第三个参数都是指向 SYSTEMTIME 结构的指针,因此至少从静态类型检查的角度来看,应该可以为这两个参数传递相同的指针。
然而,该文档没有说明这样做是否安全。
在我的测试中,我发现为两个参数传递相同的指针确实可以按预期工作。该函数确实修改了 SYSTEMTIME 结构,并且输出是正确的。
这是一个简单的例子:
#include <windows.h>
void main() {
SYSTEMTIME tm;
GetSystemTime(&tm);
SystemTimeToTzSpecificLocalTime(NULL, &tm, &tm);
wprintf(L"Local Time: %02d:%02d:%02d\n", tm.wHour, tm.wMinute, tm.wSecond);
}
我的问题是:为两个参数传递相同的指针是否安全?或者我应该使用新的 SYSTEMTIME 结构来输出?
我在文档中找不到有关此内容的任何信息。 ( https://learn.microsoft.com/en-us/windows/win32/api/timezoneapi/nf-timezoneapi-systemtimetotzspecificiallocaltime )
谢谢!
Raymond Chen 在他的《编程基本规则 – 函数参数及其使用方式》中谈到了这一点
不,您不能指望认为指向同一缓冲区是有效的。它可能会起作用。这并不意味着它是有效的。这并不意味着它将来不会破裂。
tl;dr: 这边是龙
另请参阅不相关的:
它涉及 C 语言规则,而不是 Windows 规则。