如果我写的话
#define INT_PTR int*
INT_PTR ptr4, ptr5, ptr6;
在这种情况下,只有ptr4是指向整数的指针,其余的值(ptr5和ptr6)是整数。他们如何取整数值?它应该给出一些编译错误。
为什么这样编译器将ptr5和ptr6视为整数。
答案 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;
它定义了一个新类型,它将应用于其后面的所有变量,而不是仅仅根据宏替换文本。换句话说,INTPTR
(int *
)类型适用于ptr4
,ptr5
和ptr6
中的所有三个。
答案 2 :(得分:1)
您的代码扩展为
int* ptr4, ptr5, ptr6;
由于星号(*)声明仅应用于后面的标识符,因此很自然只有ptr4实际上是指针。 (顺便说一下,这就是为什么编写
在概念上是错误的int* ptr;
因为您应该指出指针声明仅适用于一个变量,如下所示:
int *ptr.
)
因此,使用C #define
关键字代替typedef
预处理程序指令(类型定义也是错误的):
typedef int *inptr;
intptr ptr4, ptr5, ptr6;