当前位置: 技术问答>linux和unix
在源码中如何判断一个符号是变量还是指针?
来源: 互联网 发布时间:2016-05-04
本文导语: 定义一个结构类型A,如下。 typedef struct { int val; } A; 定义一个宏SetValue用于设置A类型变量的val的值,其中X即可以是指向A类型变量的指针,也可以是A类型的变量。 #define SetValue(x, y) { if (x是指针) ...
定义一个结构类型A,如下。
typedef struct
{
int val;
} A;
定义一个宏SetValue用于设置A类型变量的val的值,其中X即可以是指向A类型变量的指针,也可以是A类型的变量。
#define SetValue(x, y)
{
if (x是指针)
x->val = y;
else
x.val = y;
}
问题是,如何判断符号x是指针,还是变量???有宏可以用吗?
typedef struct
{
int val;
} A;
定义一个宏SetValue用于设置A类型变量的val的值,其中X即可以是指向A类型变量的指针,也可以是A类型的变量。
#define SetValue(x, y)
{
if (x是指针)
x->val = y;
else
x.val = y;
}
问题是,如何判断符号x是指针,还是变量???有宏可以用吗?
|
宏展开后这段代码能编译通过?
if (x是指针)
x->val = y;
else
x.val = y;
必定会有一个编译报错吧
if (x是指针)
x->val = y;
else
x.val = y;
必定会有一个编译报错吧
|
可以做到的,
typedef struct
{
struct A * pSelf;
int val;
} A;
初始化的是时候令 pSelf 指向自己
A x;
x.pSelf = &x;
下面提供一个宏判断x是指针还是不是
#define PTR_OF_A 0
#define VALUE_OF_A 1
#define SOMETHING_ELSE 2
#define BPTR(x, result) {
A *PTR_BPTR;
memcpy(&(PTR_BPTR), &(x), 4);
if (PTR_BPTR == &(x))
{
(result) = VALUE_OF_A
}
else
{
memcpy(&(PTR_BPTR), x, 4);
if (PTR_BPTR == x)
{
(result) = PTR_OF_A;
}
else
{
(result) = SOMETHING_ELSE
}
}