这是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-systemtimetotzspecificlocaltime)
谢谢!
编程基本规则 – 函数参数及其使用方式中谈到了这一点
有一些适用于所有系统编程的基本规则,很明显,大多数文档都懒得解释它们,因为这些规则应该被本领域的从业者内化到不需要表达的程度。就像在绘制行车路线时,你甚至不会考虑抄近路穿过某人的后院或沿着单行道走错路一样,就像一位经验丰富的棋手甚至不会考虑非法走法一样在决定下一步做什么时,经验丰富的程序员甚至不会考虑在没有文档明确许可的情况下违反以下基本规则:不,您不能指望认为指向同一缓冲区是有效的。它可能会起作用。这并不意味着它是有效的。这并不意味着它将来不会损坏。输出缓冲区。
(请记住,这里的每一个陈述都是一个基本的基本规则,而不是绝对不可避免的事实。假设这里的每句话都以“在没有相反指示的情况下”开头。如果调用者和被调用者都同意规则的例外情况,那么提出这个例外是很困难的,就像很难提出一个非法国际象棋动作列表一样,这些规则是如此自动,以至于它们并不是真正的规则,而只是简单的规则。因此,我确信还缺少其他“显而易见的规则”(例如,“当线程位于其他线程内部时,您不能终止该线程”。功能。”)
- 输出缓冲区不能与输入缓冲区或另一个输出缓冲区重叠。
对函数调用可以执行的操作的一个方便的经验法则是问:“如果有人对我这样做,我会怎样?” (这是“想象一下,如果这可能的话”测试的一个特例。)
tl;dr:这边是龙
另请参阅不相关的:
处理 C 语言规则,而不是 Windows 规则。