MSVC2017编译C文件时为何出现'Type转Type'的C2440错误?
问题原因解析
你的代码如下:
typedef struct Type { int value; } Type; Type foobar(Type value) { return (Type)value; }
错误产生的核心原因:C与C++标准差异,以及编译器对标准的执行严格度不同
- MSVC编译C文件时严格遵循C89标准:在C89规范中,对结构体类型进行强制转换时,不能直接使用
typedef定义的别名(这里的Type)作为转换类型符,必须显式写出struct Type。也就是说,正确的C写法应为return (struct Type)value;。MSVC对C标准的执行较为严格,因此触发了C2440类型转换错误。 - C++标准的规则不同:当编译
.cpp文件时,MSVC采用C标准,C允许直接使用typedef定义的类型别名进行强制转换,因此不会报错。 - GCC的兼容性宽松:GCC对C标准的实现更灵活,支持使用
typedef别名直接完成结构体类型的强制转换,所以编译.c文件时可以正常通过。
内容的提问来源于stack exchange,提问作者antitivoization
相关产品推荐
相关产品推荐

