c++ - 从 __int64 到 size_t 的安全转换

标签 c++ c windows type-conversion warnings

我在使用 Visual Studio 2017 的 Windows 操作系统上工作,我获得了以下函数来确定来自 SO 的一个答案的文件大小:

__int64 FileSize(const char *filename)
{
    HANDLE hFile = CreateFile(filename, GENERIC_READ,
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL, NULL);

    if (hFile == INVALID_HANDLE_VALUE) {
        return -1; // error condition, could call GetLastError to find out more
    }

    LARGE_INTEGER size;
    if (!GetFileSizeEx(hFile, &size)) {
        CloseHandle(hFile);
        return -1; // error condition, could call GetLastError to find out more
    }

    CloseHandle(hFile);
    return size.QuadPart;
}

因此,我使用它来确定文件大小,以便使用 malloc() 相应地动态分配内存。由于函数 malloc() 接受 size_t 类型,我将 FileSize() 函数的返回值分配给 size_t 变量,但是我得到了以下警告:

main.cpp(67): warning C4244: 'initializing': conversion from '__int64' to '::size_t', possible loss of data

在这种情况下,我如何安全地将文件大小存储在 size_t 变量中?我知道我可以将返回值转换为 size_t 并消除警告,但它是否安全/正确?

最佳答案

这在很大程度上是系统特定的。在某些系统上,size_t 可能小于 int64_t,这会发出警告。但是当然你不能分配超过 size_t 的内容。

size_t s = (size_t)some_int64; 最有可能是安全的。

但是,如果您感到偏执,您可以添加一个检查/断言:

#include <stdint.h>
...
if(some_int64 > SIZE_MAX) // this line is fully portable
{
  halt_and_catch_fire();
}

SIZE_MAX 是一个常量,表示 size_t 变量可以容纳的最大值。

关于c++ - 从 __int64 到 size_t 的安全转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46564815/

相关文章:

c++ - 通过 Derived::f2() 调用 f1() 时调用了谁的函数?

c++ - 在不调用 QThread::start() 的情况下使用 QThread 是否有意义?

c - 未读取 uart 缓冲区

c# - 如何查看当前用户的计划任务列表

c++ - VS2017,C++ 包含目录与附加包含目录、子文件夹包含失败 - 但为什么呢?

c++ - 当我们 push_back 元素时 std::vector 什么时候扩大自己?

c - libcurl 和特殊字符转换

c - 2个子进程之间的管道不产生任何输出

windows - 在 Virtualbox 中启动 ubuntu 时 VT-x 不可用 (VERR_VMX_NO_VMX)

linux - 如何在 Windows git 沙箱中强制 LF 用于特定文件?