Aqui está o protótipo da função SystemTimeToTzSpecificLocalTime:
BOOL SystemTimeToTzSpecificLocalTime(
[in, optional] const TIME_ZONE_INFORMATION *lpTimeZoneInformation,
[in] const SYSTEMTIME *lpUniversalTime,
[out] LPSYSTEMTIME lpLocalTime
);
Como você pode ver, o segundo e o terceiro parâmetros são ponteiros para estruturas SYSTEMTIME, portanto, pelo menos do ponto de vista da verificação de tipo estática, deve ser possível passar o mesmo ponteiro para ambos os parâmetros.
No entanto, a documentação não diz nada sobre se isso é seguro ou não.
Em meus testes, descobri que passar o mesmo ponteiro para ambos os parâmetros funciona conforme o esperado. A função modifica a estrutura SYSTEMTIME e a saída está correta.
Aqui está um exemplo simples:
#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);
}
Minha pergunta é: é seguro passar o mesmo ponteiro para ambos os parâmetros? Ou devo usar uma nova estrutura SYSTEMTIME para a saída?
Não consegui encontrar nenhuma informação sobre isso na documentação. ( https://learn.microsoft.com/en-us/windows/win32/api/timezoneapi/nf-timezoneapi-systemtimetotzspecificlocaltime )
Obrigado!
Raymond Chen fala sobre isso em seu livro Regras básicas para programação – parâmetros de função e como eles são usados
Não, você não pode esperar considerar válido apontar para o mesmo buffer. Pode funcionar. Isso não significa que seja válido. Isso não significa que não irá quebrar no futuro.
dr: Por aqui sejam dragões
Veja também o não relacionado:
que trata das regras da linguagem C, em vez das regras do Windows.