2

如果我写类似

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

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

为什么编译器会以这种方式将 ptr5 和 ptr6 视为整数。

4

3 回答 3

11

因为要声明指针对象,您将执行以下操作:

int *ptr4, *ptr5, *ptr6;

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

你可以做的是typedef

typedef int * INTPTR;
于 2012-04-07T11:47:26.527 回答
4

#define这实际上与, 只是一个文本替换无关。

在预处理器阶段(发生替换时)之后,您最终会得到:

int* ptr4, ptr5, ptr6;

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

这就是为什么我更喜欢写:

int *xyzzy;

而不是:

int* xyzzy;

因为前者更清楚地表明*属于变量。如果你想在 C 中定义一个新类型,命令是,令人惊讶的是,typedef:-)

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

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

于 2012-04-07T11:49:49.720 回答
1

您的代码扩展为

int* ptr4, ptr5, ptr6;

并且由于星号 (*) 声明仅应用于其后的标识符,因此很自然只有 ptr4 实际上是一个指针。(顺便说一句,这就是为什么写在概念上是错误的

int* ptr;

正如您应该指出的那样,指针声明仅适用于一个变量,例如:

int *ptr.

)

因此,不要使用#define预处理器指令(这对于类型定义也是错误的),而是使用 Ctypedef关键字:

typedef int *inptr;
intptr ptr4, ptr5, ptr6;
于 2012-04-07T11:53:19.577 回答