如何检测类型是C中预处理器的指针?
问题描述:
有没有办法来检测类型是否在C的预处理器中的指针?如何检测类型是C中预处理器的指针?
假设它的名字是IS_POINTER。我想要的最终结果可能如下所示:
#define DATA_STRUCTURE(KEY_T)
#if IS_POINTER(KEY_T)
/* do something */
#endif
谢谢!
答
你可以尝试使用typeof(expr)
,这可能会帮助你完成任务。它没有确切地告诉你什么是指针,但也许你可以在比较中使用它:
+1
typeof是预处理器结构还是编译器结构? –
答
预处理没有类型的概念,你可以不写,可以被用在这样一个宏#if
指令。相反,您可以使用一些不可移植的内置函数来编写一个表达式,该表达式检查给定对象是否为指针或其他内容。
这里是一个宏执行静态断言a
是一个数组:
#define assert_array(a) \
(sizeof(char[1 - 2 * __builtin_types_compatible_p(typeof(a), typeof(&(a)[0]))]) - 1)
它可以与gcc
和clang
使用。我用它来使countof()
宏更安全:
#define countof(a) ((ssize_t)(sizeof(a)/sizeof(*(a)) + assert_array(a)))
难道你不知道自从你写代码后它是否是指针吗?我不确定我是否明白你真正想要完成的事情。你问这个问题的目标是什么? –
我不认为这是可能的。预处理器对C语言知之甚少,并且实际上在C代码甚至没有被解析的时间点执行。根据你想要达到的目标,你可能会对C11的[通用选择](http://en.cppreference.com/w/c/language/generic)有一些好运。 – 5gon12eder
这听起来像是[XY问题](http://mywiki.wooledge.org/XyProblem)。你为什么需要知道这个?你真的想做什么? –