c - 显式转换总是与隐式转换相同吗?

标签 c visual-studio warnings

在 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/

相关文章:

c - C 中的指针和字符串输出

android - 检查 sdk 版本后缺少 PendingIntent 可变性标志给出警告

c# - visual studio中的 "File has no header"构建警告是什么意思

c++ - 如何让 DCMTK 库在 Qt Creator 中工作?

node.js - 如何查找 Node.js UnhandledPromiseRejectionWarning 中哪些 Promise 未处理?

ios - 警告 : Attempting to create USE_BLOCK_IN_FRAME

c - 宏末尾的 avr-libc (void)__s

c - 为什么我不能创建一个名为 pow() 的函数?

c - librrd链接问题

visual-studio - Visual Studio 和 Temp 文件夹的病毒扫描