我在使用 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/