加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何验证C宏中的类型

发布时间:2020-12-16 05:39:37 所属栏目:百科 来源:网络整理
导读:我一直在想方法来验证C宏中的类型,到目前为止,我提出的最好的方法是: #define ASSERT_PTYPE(TYPE,VALUE) (0 (*(int (*)(TYPE*))0)(VALUE)) 这显然需要一个类型名称和一个指向该类型的指针.也可以创建类似的ASSERT_TYPE宏.这似乎与GCC相当好.在类型不匹配的
我一直在想方法来验证C宏中的类型,到目前为止,我提出的最好的方法是:
#define ASSERT_PTYPE(TYPE,VALUE) (0 && (*(int (*)(TYPE*))0)(VALUE))

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

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

解决方法

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

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

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读