【问题标题】:Why is {typedef int* PTR;const PTR p=#} not equivalent to "const int* p=&num" but to "int *const p=&num"?为什么 {typedef int* PTR;const PTR p=#} 不等同于“const int* p=&num”而是“int *const p=&num”?
【发布时间】:2013-05-09 13:04:34
【问题描述】:

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

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

typedef int* PTR;
const PTR p=#

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

编辑:如果我们打算如下,那么typedef 语句的正确语法是什么:

  const int* const p=#

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

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

【问题讨论】:

    标签: c pointers constants typedef


    【解决方案1】:

    一般来说

    const TYPE var = ini;
    

    声明const 变量var 类型为TYPE。所以

    const PTR p=#
    

    声明PTR类型的const变量p,用num的地址初始化。

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

    如果你想得到

    const int* const p=#
    

    使用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;
    

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

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

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

    【讨论】:

    • 我忘记添加 2 个重要点。我已将它们添加为 Edits。您能查看一下吗?
    • 拥有指针类型的 typedef 的一个原因是当您将它们用作 API 之外的不透明对象时。所以struct foo_magic_structure; typdef my_magic_structure* foo_handle; 然后你的API 在任何地方都引用foo_handle。当然,这更适用于 C 而不是 C++。
    【解决方案2】:

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

    限定符(constvolatile)永远不会穿透typedef

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

    【讨论】:

    • 您能否查看我刚刚添加到我的问题中的 编辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 2020-08-03
    • 2010-11-02
    • 1970-01-01
    • 2013-08-13
    • 2010-11-11
    相关资源
    最近更新 更多