我可以确定类型是否为C语言中的指针类型吗?

时间:2019-02-12 10:20:42

标签: c metaprogramming

我知道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%的准确度并且可以容忍一些假阳性,那么你们会指导我做出决定。

1 个答案:

答案 0 :(得分:1)

否,除非您知道指针可能是哪种类型。我不知道任何非标准的gcc / clang扩展都可以实现它。您可以执行的最接近的操作是comptime断言某个对象是一个指针,例如,使用(void const*){TheThing}(还将接受零文字,因为可以使用它们的空指针和数组(可以使用{{1} }清除掉那些)),或者在将_Generic*结合使用时,对其应用指针op([0]_Generic)来清除数组。