C23中能否用+运算符替代typeof_unqual去除typeof的类型限定符?
用+运算符替代C23的typeof_unqual处理标量类型可行吗?
问题说明
C23标准新增了typeof_unqual关键字,用来获取对象的非限定类型。针对标量类型,能不能只用+运算符来替代typeof_unqual的功能?(我知道这个方法对结构体/联合体类型无效),但在不同编译器里测试得到了不一样的结果。
测试代码
int main() { const int A; typeof(+A) B; B = 5; return 0; }
结论与分析
- 从C语言的类型转换规则来看,给标量类型的表达式用一元
+运算符时,会触发寻常算术转换:- 首先
const这类限定符会被丢弃——因为一元+的运算结果是右值,C标准规定右值的类型是非限定的; - 对于整数、浮点这类标量,一元
+不会改变其底层类型,只会移除const、volatile等限定符。
- 首先
- 不同编译器出现结果差异的原因:
- 部分老版本编译器(比如旧版GCC)对
typeof扩展的实现细节有偏差,推导+A的类型时没完全遵循标准; - 如果标量类型是
_Atomic限定的,一元+会将其转换为对应的非原子类型,这和typeof_unqual的行为一致,但不同编译器对_Atomic的支持程度不同。
- 部分老版本编译器(比如旧版GCC)对
- 总结:在符合C23标准的编译器中,针对普通标量类型(非原子、非结构体/联合体),
typeof(+A)确实能达到和typeof_unqual(A)一样的效果。但如果依赖的是编译器扩展的typeof而非C23标准原生的typeof,就可能出现行为不一致的情况。
内容的提问来源于stack exchange,提问作者Badasahog
相关产品推荐
相关产品推荐

