检查宏参数是否为指针

标签 c variables pointers macros variable-types

是否有一些“不错”的方法来检查传递给宏的变量是否是指针?例如

#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 有一个新功能,可以让您观察特定的指针类型,但不是一般的“指针性”。例如你可以做点什么

#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 和其他你已经可以用一些内置函数模拟这个特性,参见 P99 .

关于检查宏参数是否为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19255148/

相关文章:

c - C中如何存储变量值?

c - 数组与指向指针的指针

c - 在 C 中将位 vector 作为数组进行迭代的最佳方法

C套接字重定向

c - 组装一个 lParam 消息,这是正确的代码吗?

c - 如何处理结构数组?

C++ 相同的字符串不相等(实际上是 char*)

c - 十一2.如何忽略修饰键事件?

javascript - 在全局范围内使用 "let"创建的变量与在循环内使用 "var"创建的变量

python - 在 Python 中,如何检查变量是否存在?