我想要一个可以决定给定变量是否为指针的宏?
我的要求如下:
#define IS_PTR(x) ?
#define MY_TEST(x) IS_PTR(x)?&(*x):x ===> 1 if ptr and 0 means ref.
void main()
{ int a;
int *b;
int *c = MY_TEST(*b) ====> I have to *b instead of b directly
====> after precompilation int *c = &b
int d = MY_TEST(a) ====> after precompilation int d = d
}
答案 0 :(得分:3)
在引擎盖下,指针与32位或64位无符号整数相同。我不认为有一种方法可以将指针与C中的基本类型区分开来。
答案 1 :(得分:2)
在C ++中,您可以将此声明为返回false的模板,然后为class T
专门化该模板,以便is_ptr(const T* _)
返回true。
C ++ 11在is_pointer
中有<type_traits>
。
答案 2 :(得分:-2)
在C11中,您可以使用通用选择。我不明白你想做什么。
#include <stdio.h>
#define IS_PTR(x) _Generic((x), int *: 1, int: 0)
void main() {
int a;
int *b;
printf("IS_PTR(a) = %d\n", IS_PTR(a));
printf("IS_PTR(b) = %d\n", IS_PTR(b));
}
此输出
IS_PTR(a) = 0
IS_PTR(b) = 1
在我的系统上。
编辑:出于某种原因,人们正在低估这个答案。虽然这对于区分指针和非指针一般不起作用,但它确实适用于任意数量的类型。对于OP或遇到这个问题的其他人来说,这可能已经足够了。
目前最重要的答案声称指针只是“引擎盖下”的整数。根据“引擎盖下”的确切含义,这并不完全正确。 (最后,一切都只是整数和浮点数......)