gpt4 book ai didi

c - 如何验证 C 宏中的类型

转载 作者:太空狗 更新时间:2023-10-29 16:49:26 27 4
gpt4 key购买 nike

我一直在考虑在 C 宏中验证类型的方法,到目前为止我想出的最好方法是:

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

这显然需要一个类型名称和一个指向该类型的指针。也可以制作类似的 ASSERT_TYPE 宏。这似乎适用于 GCC。如果类型不匹配,它甚至会给出非常有用的错误消息。问题是我不能完全确定这是有效的 C 还是最好的方法。

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

最佳答案

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

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

这确保 VALUETYPE 的赋值兼容。由于赋值,表达式返回右值。

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

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

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

第二行也是 double[4] 类型的左值,编译时会检查该属性。

关于c - 如何验证 C 宏中的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5349749/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com