【发布时间】:2018-03-15 20:16:04
【问题描述】:
我正在使用 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): 警告 C4244: 'initializing': 从 '__int64' 转换为 '::size_t',可能丢失数据
在这种情况下,我如何安全地将文件大小存储在 size_t 变量中?我知道我可以将返回值转换为 size_t 并消除警告,但它是否安全/正确?
【问题讨论】:
-
是c还是c++?
-
在我使用的 2015 MSVC 中,
sizeof(size_t)是 4。我想这就是为什么您会收到有关可能丢失数据的消息。 -
你编译的是 32 位还是 64 位?
size_t基本上代表了你可以拥有的地址范围。 -
如果在 32 位模式下编译,
size_t将是 32 位。文件可能大于适合 32 位的文件。如果你确定不是,你可以试试演员表。否则,您也许可以使用unsigned long long或std::uint64_t而不是size_t。 -
@NathanOliver 我正在编译 32 位。
标签: c++ c windows type-conversion warnings