C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何验证C宏中的类型大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在想方法来验证C宏中的类型,到目前为止,我提出的最好的方法是: @H_301_2@#define ASSERT_PTYPE(TYPE,value) (0 && (*(int (*)(TYPE*))0)(value))

这显然需要一个类型名称一个指向该类型的指针.也可以创建类似的ASSERT_TYPE宏.这似乎与GCC相当好.在类型不匹配的情况下,它甚至提供了非常有用的错误消息.问题是我不完全肯定这是有效的C或最好的方法.

据了解,该标准表示您可以转换一个函数指针,但调用函数指针的结果是未定义的.在这种情况下,不可能在运行时调用函数.这样够好还是标准意味着你甚至不能编写不能调用转换函数代码

解决方法

用C99和复合文字你可以做一些类似的事情 @H_301_2@#define ASSERT_TYPE(TYPE,value) ((TYPE){ 0 } = (value))

这样可确保VALUE与TYPE兼容.该表达式由于赋值而返回值.

复合文字函数范围以及文件范围内工作,任何体面的编译器都应优化创建的额外对象.

添加:该宏中的TYPE可以是任何有效的类型名称,例如指针double *,struct或union struct toto,除了数组.由于赋值,double [4]等数组类型将无法正常工作.使用指针@H_404_19@数组double(*)[4]代替,例如

@H_301_2@double A[4]; (*ASSERT_TYPE(double(*)[4],&A))

其中第二行又是一个类型double [4]的左值,这是该属性的编译时间.

大佬总结

以上是大佬教程为你收集整理的如何验证C宏中的类型全部内容,希望文章能够帮你解决如何验证C宏中的类型所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。