这个问题在另一个关于SO的问题中被部分触及,但有些随意,因为它不是主要问题。由于我的困惑仍然存在,我将其置于一个单独的问题中。
为什么以下两个语句相当于int* const p=&num
而不是const int* p=&num
,后者似乎更符合逻辑和直观? typedef
这种行为的严格原因是什么?
typedef int* PTR;
const PTR p=#
最后,在这个问题中,一位成员评论说使用typedef
ed指针是不好的做法。但我已经看到它被广泛用于许多书籍和网站,这似乎是一件很方便的事情。它使代码更容易理解。那么最后一句话是什么呢?应该尽可能避免使用typedef
指针吗?
编辑:如果我们打算执行以下操作,那么typedef
语句的正确语法是什么:
const int* const p=#
编辑:我无意中忘了问一件重要的事情。对于以下内容,使用typedef
语句的正确语法是什么?
const int* p=# //instead of the int* const p=&num that we got
答案 0 :(得分:4)
通常,
const TYPE var = ini;
声明类型为const
的{{1}}变量var
。所以
TYPE
声明类型为const PTR p=#
的{{1}}变量const
,并使用p
的地址进行初始化。
PTR
不是文字别名,因此您不能将num
ed name替换为其扩展名,以查看其结果。
如果你想获得
typedef
typedef
,您必须const int* const p=#
包括typedef
在内的某些内容,例如
typedef
然后你可以写
const int
(但不要,这很丑)。
而
typedef const int *CI_ptr;
然后你可以写
const CI_ptr p = #
最后,在这个问题中,一位成员评论说使用
const int *p = #
指针是不好的做法。但我看到它被广泛用于许多书籍和网站,看起来很方便,这使得代码更容易理解。
是否使代码更容易理解或更少取决于。根据我的经验,有一件事总是一件坏事,就是CI_ptr p = #
指向名称的指针类型隐藏了你正在处理指针的事实。
typedef
例如,一个不幸的是常见的滥用。当您读取类型typedef
时,您不会怀疑它是指针。至少将其定义为typedef struct list_node {
int value;
struct list_node next;
} *node;
。但是,为什么node
指针,node_ptr
结构并使用typedef
更短更清晰。
那么关于它的最后一句话是什么?应该尽可能避免使用
typedef
指针吗?
它没有最终权威,所以这主要是你的决定。如果有的话,请遵循公司/项目中的编码风格,如果您自己编码,请使用您的判断。
答案 1 :(得分:0)
这是将typedef
用于对象指针类型的问题之一。
限定符(const
,volatile
)永远不会穿透typedef
。
这是一些编码标准禁止将typedef
用于对象指针类型的原因之一。