在 Visual C 中我有:
#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 类型来删除警告,可以吗? 我假设编译器已经自动执行完全相同的操作。
最佳答案
是的,当两种类型转换(“强制转换”)都适用时(显式和隐式),显式转换的语义与隐式转换的语义完全相同。
请注意,在您的情况下,隐式转换是否适用并不明显。在 WinodwsAPI 中,HANDLE
通常被定义为指针类型。您正在尝试将其转换为 int
类型。标准 C 不允许从指针类型到 int
的隐式转换。这意味着以下声明
HFILE stat_fh = INVALID_HANDLE_VALUE;
包含违反约束的情况。即它应该是不可编译的。所以,你的问题实际上是没有意义的(假设将 HANDLE
转换为 int
确实是你想要做的)。在这种情况下,显式强制转换是您唯一的选择。
如果您的编译器可以隐式执行此转换(仅发出警告),那么这只是您的编译器的一个怪癖,与标准 C 语言完全无关。
关于c - 显式转换总是与隐式转换相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19639117/