注意:这是NOTPaul T 链接的问题的重复项,因为我问是否可以在编译时确定类型是否属于某种更广泛的不完整类型/种类,而不是在编译时是否已注册符号。这似乎是对这个问题的根本误解。
我正在用 C 编写一个库,该库处理伪通用函数,该函数通过宏包装器将类型作为参数。
为了节省细节(因为它们相当复杂),我认为有两个可能的功能可以提供帮助:
我已经在 Godbolt 上尝试了我能想到的一切(甚至尝试将类型与不完整的匿名结构进行比较并尝试使用 __builtin_types_completed_p),但无法找到任何解决方案。
如果有人有任何解决方案,我很乐意看到它们,否则我最终可能不得不使设计变得复杂一些——所以如果不可能,那也不是世界末日,但如果可以做到,那就太理想了。
为了大致了解这些宏之一的外观或其预期输出:
int *a;
assert(!IS_STRUCT(a));
assert(IS_POINTER(a));
struct {} b;
assert(IS_STRUCT(b));
assert(!IS_POINTER(b));
不应该抛出任何错误。
完整答案(如果使用 EDG 前端):
如果您的 IDE/编译器正在使用 EDG C++ 前端(很多都是这样),并且您正在使用C,而不是 C++ (您的标签建议),并且您说您正在使用 typeof,那么您可以检测如下结构(请参阅最新手册,第 75 页 https://www.edg.com/docs/edg_cpp.pdf):
/* Test if EDG Front End is used*/
#if defined(__EDG__) && defined(__EDG_VERSION__)
#define IS_STRUCT(expression_or_type_name) __is_class(typeof (expression_or_type_name)))
#endif
自从在C __is_class()仅适用于struct (http://www.cplusplus.com/reference/type_traits/is_class/ http://www.cplusplus.com/reference/type_traits/is_class/).
此外,指针可以类似地检测如下:
/* Test if EDG Front End is used*/
#if defined(__EDG__) && defined(__EDG_VERSION__)
#define IS_POINTER(expression_or_type_name) (__is_convertible_to(typeof (expression_or_type_name), void*) || __is_convertible_to(typeof (expression_or_type_name), void const*) || __is_convertible_to(typeof (expression_or_type_name), void volatile*) || __is_convertible_to(typeof (expression_or_type_name), void const volatile*))
#endif
(http://www.cplusplus.com/reference/type_traits/is_convertible/ http://www.cplusplus.com/reference/type_traits/is_convertible/)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)