我知道C是_Generic macros。甚至可以为ANSI C实现一些有限的typename()
(就像提到的here一样)。
但是我可以在C中实现类似std::is_pointer的东西吗? 例如:
#define IS_POINTER_TYPE(x) // ?
struct Vec2 {
float x;
float y;
};
int main(int argc, char* argv[], char* env[])
{
IS_POINTER_TYPE(Vec2*); // true
IS_POINTER_TYPE(int*) // true
IS_POINTER_TYPE(char) // false
IS_POINTER_TYPE(const int) // false
}
我可以为变量而不是类型执行此操作吗?谢谢。
UPD: This解决方案不是可移植的,不幸的是不是通用的。一个需要猴子作业复制粘贴或代码生成,以使您的所有结构都符合此表示法。如果您不需要100%的准确度并且可以容忍一些假阳性,那么你们会指导我做出决定。
答案 0 :(得分:1)
否,除非您知道指针可能是哪种类型。我不知道任何非标准的gcc / clang扩展都可以实现它。您可以执行的最接近的操作是comptime断言某个对象是一个指针,例如,使用(void const*){TheThing}
(还将接受零文字,因为可以使用它们的空指针和数组(可以使用{{1} }清除掉那些)),或者在将_Generic
与*
结合使用时,对其应用指针op([0]
,_Generic
)来清除数组。