如何validationC宏中的类型

我一直在考虑如何validationC宏中的类型,到目前为止,我提出的最佳方法是:

#define ASSERT_PTYPE(TYPE, VALUE) (0 && (*(int (*)(TYPE*))0)(VALUE)) 

这显然需要一个类型名称和指向该类型的指针。 也可以制作类似的ASSERT_TYPE宏。 这似乎与海湾合作委员会合作得很好。 它甚至在类型不匹配的情况下提供了非常有用的错误消息。 问题是我不能完全确定这是有效的C还是最好的方法。

据我所知,标准说你可以转换函数指针,但调用转换函数指针的结果是未定义的。 在这种情况下,不可能在运行时调用该函数。 这是否足够好或标准是否意味着你甚至无法编写无法调用的代码来调用强制转换函数?

使用C99和复合文字,你可以做类似的事情

 #define ASSERT_TYPE(TYPE, VALUE) ((TYPE){ 0 } = (VALUE)) 

这可确保VALUETYPE分配兼容。 由于赋值,表达式返回rvalue。

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

另外 :该宏中的TYPE可以是任何有效的类型名称,例如指针double* ,struct或union struct toto ,除了数组。 由于赋值,诸如double[4]类的数组类型将不起作用。 使用指向数组double(*)[4]指针,例如,如

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

其中第二行又是double[4]类型的左值,它是为该属性检查的编译时间。