了解#define的本质

时间:2012-04-07 11:46:26

标签: c

如果我写的话

#define INT_PTR int*
INT_PTR ptr4, ptr5, ptr6;

在这种情况下,只有ptr4是指向整数的指针,其余的值(ptr5和ptr6)是整数。他们如何取整数值?它应该给出一些编译错误。

为什么这样编译器将ptr5和ptr6视为整数。

3 个答案:

答案 0 :(得分:11)

因为你要声明指针对象:

int *ptr4, *ptr5, *ptr6;

在C中,令牌*不属于类型信息,因此在声明多个对象时必须重复它。请注意,这是C中的常见错误。

您可以做的是改为typedef

typedef int * INTPTR;

答案 1 :(得分:4)

这实际上与#define无关,int* ptr4, ptr5, ptr6; 只是一个文本替代品。

在预处理器阶段之后(进行替换时),最终得到:

*

并且,因为int *xyzzy; 绑定到变量而不是类型,所以您创建了一个整数指针和两个整数。

这就是我喜欢写的原因:

int* xyzzy;

而不是:

*

因为前者更清楚typedef属于变量。如果你想在C中定义一个新类型,那么命令就足够了{{1} }: - )

typedef int * INTPTR;
INTPTR ptr4, ptr5, ptr6;

它定义了一个新类型,它将应用于其后面的所有变量,而不是仅仅根据宏替换文本。换句话说,INTPTRint *)类型适用于ptr4ptr5ptr6中的所有三个。

答案 2 :(得分:1)

您的代码扩展为

int* ptr4, ptr5, ptr6;

由于星号(*)声明仅应用于后面的标识符,因此很自然只有ptr4实际上是指针。 (顺便说一下,这就是为什么编写

在概念上是错误的
int* ptr;

因为您应该指出指针声明仅适用于一个变量,如下所示:

int *ptr.

因此,使用C #define关键字代替typedef预处理程序指令(类型定义也是错误的):

typedef int *inptr;
intptr ptr4, ptr5, ptr6;