gpt4 book ai didi

c++ - 如何将 unsigned long 转换为 64 位的 time_t

转载 作者:行者123 更新时间:2023-11-30 04:58:16 25 4
gpt4 key购买 nike

我在 MSVC6 (Visual Studio 98) 的 32 位中像这样在 C++ 中调用本地时间:

localtime((time_t *)&FileData.LastAccessDateTime)

FileData.LastAccessDateTime 是一个无符号长整数,它在 32 位中编译和运行良好。我现在正在用 VS2017 转换代码。它在 64 位中编译得很好,但它在运行时在本地时间 b/c 中崩溃,传递给本地时间的高位双字充满了垃圾。我知道我可以将 FileData.LastAccessDateTime 分配给临时 time_t 变量,然后获取该变量的地址。但是我想在不创建本地临时变量的情况下解决这个问题,因为我必须在代码的其他 100 个地方解决这个问题。我尝试将 FileData.LastAccessDateTime 转换为 __int64,但出现编译错误:“&”需要左值。这对我来说似乎很奇怪 b/c FileData.LastAccessDateTime 在内存中有一个物理地址,我只是改变了查看它的方式(或者我认为如此)。

那么,我怎样才能在一行中更改此转换,以将 unsigned long 正确地转换为 time_t 值?

最佳答案

问题的核心是我们需要向 localtime 提供一个指向 8 字节大小内存位置的指针,而 FileData.LastAccessDateTime 只有 4 字节.因此,我们需要在其他地方抢占一些空间。

选项 1: 8 字节空间将位于。应该这样做:

localtime(std::make_unique<time_t>(FileData.LastAccessDateTime).get());

unique_ptr 处理堆分配和清理。当然,这每次都会花费您一次内存分配。这是否可以由您决定。

选项 2:8 字节空间将在堆栈中。这里没有绕过函数局部对象的方法,但您可以将它包装到一个方便的函数中(您希望它可以在所有这 100 个地方可用):

struct tm * localtime64comp(uint32_t* timer32)
{
uint64_t timer64 = timer32;
return localtime(timer64);
}

// ...

localtime64comp((time_t *)&FileData.LastAccessDateTime);

如果你不能让这个功能随处可用,这似乎是不可行的。

选项 3:使用 global (ugh) 作为空间。

uint64_t LOCALTIME_COMP;

// ...

localtime(&(LOCALTIME_COMP = FileData.LastAccessDateTime));

这显然不是线程安全的(编辑:我猜你可以让它成为线程本地的)并且仍然有同样的可用性问题,所以我会避免它。但它会起作用。

关于c++ - 如何将 unsigned long 转换为 64 位的 time_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51751516/

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