2017-06-19 99 views
1

有没有办法来检测类型是否在C的预处理器中的指针?如何检测类型是C中预处理器的指针?

假设它的名字是IS_POINTER。我想要的最终结果可能如下所示:

#define DATA_STRUCTURE(KEY_T) 

#if IS_POINTER(KEY_T) 
/* do something */ 
#endif 

谢谢!

+1

难道你不知道自从你写代码后它是否是指针吗?我不确定我是否明白你真正想要完成的事情。你问这个问题的目标是什么? –

+1

我不认为这是可能的。预处理器对C语言知之甚少,并且实际上在C代码甚至没有被解析的时间点执行。根据你想要达到的目标,你可能会对C11的[通用选择](http://en.cppreference.com/w/c/language/generic)有一些好运。 – 5gon12eder

+1

这听起来像是[XY问题](http://mywiki.wooledge.org/XyProblem)。你为什么需要知道这个?你真的想做什么? –

回答

0

你可以尝试使用typeof(expr),这可能会帮助你完成任务。它没有确切地告诉你什么是指针,但也许你可以在比较中使用它:

https://gcc.gnu.org/onlinedocs/gcc/Typeof.html

+1

typeof是预处理器结构还是编译器结构? –

0

预处理没有类型的概念,你可以不写,可以被用在这样一个宏#if指令。相反,您可以使用一些不可移植的内置函数来编写一个表达式,该表达式检查给定对象是否为指针或其他内容。

这里是一个宏执行静态断言a是一个数组:

#define assert_array(a) \ 
    (sizeof(char[1 - 2 * __builtin_types_compatible_p(typeof(a), typeof(&(a)[0]))]) - 1) 

它可以与gccclang使用。我用它来使countof()宏更安全:

#define countof(a) ((ssize_t)(sizeof(a)/sizeof(*(a)) + assert_array(a)))