用于确定变量是否为指针的宏

时间:2015-09-16 07:22:00

标签: c++ c++11

我想要一个可以决定给定变量是否为指针的宏?

我的要求如下:

#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   
}

3 个答案:

答案 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或遇到这个问题的其他人来说,这可能已经足够了。

目前最重要的答案声称指针只是“引擎盖下”的整数。根据“引擎盖下”的确切含义,这并不完全正确。 (最后,一切都只是整数和浮点数......)