C宏 – 检查变量是否为指针

刚开始考虑这一点,并想知道是否有一些“好”的方法来检查传递给c中的宏的变量是否是一个指针? 即:

#define IS_PTR(x) something int a; #if IS_PTR(a) printf("a pointer we have\n"); #else printf("not a pointer we have\n"); #endif 

这个想法并不是说这是在运行时完成而是编译时间,如下所示:我们根据变量是否为指针得到不同的代码。 所以我希望IS_PTR()以某种方式评估某种常量表达式。 我是怎么回事这个想法的?

这一切都有可能吗?在这种情况下会怎样做? 提前致谢!

当你在问题中暗示时,通过#if的预处理器肯定无法观察到它。 预处理器对类型一无所知,只知道从它们构造的标记和表达式。

C11有一个新function,可以让你观察特定的指针类型,但不是一般的“指针”。 你可以做点什么

 #define IS_TOTOP(X) _Generic((X), default: 0, struct toto*: 1) 

或者如果你想要宏也适用于数组

 #define IS_TOTOPA(X) _Generic((X)+0, default: 0, struct toto*: 1) 

已经有一些编译器实现了这个,即clang,对于gcc和其他编译器,你已经可以用一些内置函数模拟该function,参见P99 。

NULL几乎是您唯一可以寻找的东西。 没有办法确定某些东西是否是指针。