2

在 Visual CI 中有:

#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)
typedef int HFILE;
HFILE stat_fh = INVALID_HANDLE_VALUE;

我有警告:

"..warning C4047: '=' : 'HFILE' differs in levels of indirection from 'HANDLE'"

如果我通过将INVALID_HANDLE_VALUE转换为HFILE类型来删除警告,可以吗?我假设编译器已经自动完成了完全相同的事情。

4

2 回答 2

1

它可能会起作用,但并不好(尽管这似乎是 Microsoft 所期望的;见下文)。

首先,你的术语有点不对劲。强制转换是一个运算符,由括号中的类型名称组成。它指定了显式转换。没有隐式转换或“自动转换”之类的东西。你所说的“强制施法”仅仅是施法;你所说的“自动转换”是一种隐式转换

HFILE只是int. 根据Microsoft 的文档HANDLEvoid*. 该语言没有定义从任何指针类型到int. 在这种情况下,您的编译器会让您侥幸逃脱并发出警告。实际上,分配是违反约束的,需要诊断消息。您的编译器可能(而且恕我直言应该)简单地拒绝您的程序并显示致命错误消息。

如果你有一个指针值,你应该把它赋给一个相同类型的指针变量。

如果你想给 赋值HANDLEstat_fh那么你应该声明stat_fh为 a HANDLE,而不是 an int(甚至声明为 an HFILE,正如我所说的,这只是 的另一个名称int)。

为什么定义HFILE为 的别名int

更新 :

我看到微软HFILE实际上将其定义为:

typedef int HFILE;

他们的文档还说这是“由OpenFileHFILE打开的文件的句柄,而不是CreateFile ”。如果您点击这些链接,您会发现不推荐这样做。OpenFile

另一方面,文档OpenFile说由OpenFile(返回一个HFILE,即一个int)打开的文件应该通过将句柄传递给关闭,该句柄CloseHandle接受一个HANDLE(即,void*)参数。

这太骇人听闻了,我猜这是微软决定不鼓励使用OpenFile.

据我所知(虽然我不是 Windows 程序员,所以我可能会遗漏一些东西),没有充分的理由使用HFILE.

于 2013-10-28T15:53:23.170 回答
1

是的,当两种类型转换(“强制转换”)都适用时——显式和隐式——显式转换的语义与隐式转换的语义完全相同。

请注意,在您的情况下,隐式转换是否适用并不明显。在 WinodwsAPIHANDLE中通常定义为指针类型。您正在尝试将其转换为int类型。标准 C 不允许从指针类型隐式转换为int. 这意味着以下声明

HFILE stat_fh = INVALID_HANDLE_VALUE;

包含约束违规。即它应该是不可编译的。因此,您的问题实际上没有实际意义(假设将 a 转换HANDLE为 anint确实是您想要做的)。在这种情况下,显式转换是您唯一的选择。

如果您的编译器可以隐式执行此转换(仅发出警告),那么它只是您的编译器的一个怪癖,与标准 C 语言完全无关。

于 2013-10-28T16:21:46.817 回答