4

这件事在另一个关于 SO 的问题中被部分触及,但有些随意,因为它不是主要问题。由于我的困惑仍然存在,我将其放在一个单独的问题中。

为什么以下两个陈述等同于int* const p=&num而不是const int* p=&num后者看起来更合乎逻辑和直观?这种行为的严格原因是typedef什么?

typedef int* PTR;
const PTR p=#

最后,在那个问题中,一位成员评论说使用typedefed 指针是不好的做法。但我已经看到它在许多书籍和网站中被广泛使用,这似乎是一件方便的事情。它使代码更易于理解。那么它的最后一句话是什么?是否应该typedef尽可能避免使用 ed 指针?

编辑:typedef如果我们打算执行以下操作,那么该语句的正确语法是什么:

  const int* const p=#

编辑:我无意中忘记问一个重要的事情。那么使用该typedef语句的正确语法是什么?

  const int* p=#      //instead of the int* const p=&num that we got
4

2 回答 2

4

一般来说,

const TYPE var = ini;

声明一个类型的const变量。所以varTYPE

const PTR p=#

声明一个类型为 的const变量,用 的地址初始化。pPTRnum

Atypedef不是文本别名,因此您不能仅将typedefed 名称替换为其扩展名以查看其结果。

如果你想得到

const int* const p=#

使用 a typedef,您必须typedef包含一些内容const int,例如

typedef const int *CI_ptr;

然后你可以写

const CI_ptr p = #

(但不要,它很难看)。

而对于

const int *p = #

然后你可以写

CI_ptr p = #

最后,在那个问题中,一位成员评论说使用typedefed 指针是不好的做法。但我已经看到它在许多书籍和网站中被广泛使用,并且看起来很方便,这使得代码更易于理解。

它是否使代码更易于理解或更少取决于。根据我的经验,一件坏事总是将typedef指针类型指向隐藏您正在处理指针的事实的名称。

typedef struct list_node {
    int value;
    struct list_node next;
} *node;

例如,不幸的是一种常见的滥用行为。当您阅读 typenode时,您不会怀疑它是一个指针。至少 typedef 它到node_ptr. 但是,为什么typedef指针,typedef结构和使用node*更短更清晰。

那么它的最后一句话是什么?是否应该typedef尽可能避免使用 ed 指针?

它没有最终的权威,所以它主要是你的决定。如果有,请遵循公司/项目中的编码风格,如果您是自己编码,请自行判断。

于 2013-05-09T13:11:05.837 回答
0

这是使用typedef对象指针类型的问题之一。

限定符 ( const, volatile) 永远不会穿透typedef.

这就是一些编码标准禁止使用typedef对象指针类型的原因之一。

于 2013-05-09T13:10:42.683 回答