如果我写类似
#define INT_PTR int*
INT_PTR ptr4, ptr5, ptr6;
在这种情况下,只有 ptr4 是指向整数的指针,其余值(ptr5 和 ptr6)是整数。他们如何取整数值?要么它应该给出一些编译错误。
为什么编译器会以这种方式将 ptr5 和 ptr6 视为整数。
如果我写类似
#define INT_PTR int*
INT_PTR ptr4, ptr5, ptr6;
在这种情况下,只有 ptr4 是指向整数的指针,其余值(ptr5 和 ptr6)是整数。他们如何取整数值?要么它应该给出一些编译错误。
为什么编译器会以这种方式将 ptr5 和 ptr6 视为整数。
因为要声明指针对象,您将执行以下操作:
int *ptr4, *ptr5, *ptr6;
在 C 中,token*
不属于类型信息,因此在声明多个对象时必须重复。请注意,这是 C 语言中的常见错误。
你可以做的是typedef
:
typedef int * INTPTR;
#define
这实际上与, 只是一个文本替换无关。
在预处理器阶段(发生替换时)之后,您最终会得到:
int* ptr4, ptr5, ptr6;
并且,因为*
绑定到变量而不是类型,所以您创建了一个整数指针和两个整数。
这就是为什么我更喜欢写:
int *xyzzy;
而不是:
int* xyzzy;
因为前者更清楚地表明*
属于变量。如果你想在 C 中定义一个新类型,命令是,令人惊讶的是,typedef
:-)
typedef int * INTPTR;
INTPTR ptr4, ptr5, ptr6;
这定义了一个新类型,它将应用于它后面的所有变量,而不仅仅是根据宏替换文本。换句话说,类型INTPTR
( int *
) 适用于所有三个ptr4
,ptr5
和ptr6
。
您的代码扩展为
int* ptr4, ptr5, ptr6;
并且由于星号 (*) 声明仅应用于其后的标识符,因此很自然只有 ptr4 实际上是一个指针。(顺便说一句,这就是为什么写在概念上是错误的
int* ptr;
正如您应该指出的那样,指针声明仅适用于一个变量,例如:
int *ptr.
)
因此,不要使用#define
预处理器指令(这对于类型定义也是错误的),而是使用 Ctypedef
关键字:
typedef int *inptr;
intptr ptr4, ptr5, ptr6;