【问题标题】:Why is the non-const pointer being treated as a const when using typedef?为什么在使用 typedef 时非常量指针被视为 const?
【发布时间】:2012-08-08 12:53:20
【问题描述】:
typedef char* c;
const c ptr1 = "pointer";
++ptr1; /// error
const char* ptr2 = "pointer";
++ptr2; /// runs fine

现在ptr1 应该是const char* 类型,因此是一个非常量指针,那么为什么它被视为一个常量指针呢?

【问题讨论】:

    标签: c pointers constants


    【解决方案1】:

    它们不一样。

    第一个指定一个const-pointer-to-char,第二个是一个point-to-const-char。

    尝试从右到左阅读:

    const char *p;  // p is a pointer to char which is const
    char const *p;  // p is a pointer to const char (same as previous)
    char * const p; // p is a const pointer to char
    char const * const p; // p is a const pointer to const char
    

    通过使用 typedef typedef char* c,您将“指向 char 的指针”的含义打包成一个别名 c

    const c p; // p is a const [c] --> p is a const [pointer to char]
    

    补充说明:

    Typedef 不像宏那样就地扩展,即

    const c p;
    

    真的变成了

    const [char*] p;
    

    它确实变成了

    const char* p; // Nope.
    

    不要在你的脑海中像宏一样扩展它,使用 typedef,你已经将 char* 绑定在一起并形成了一个原子。

    【讨论】:

    • 这很有趣。我真的很惊讶。 +1
    • 我知道,但是什么时候不应该被编译器视为 const char *,因为 c 被扩展为 char *,这就是我要问的。
    • 出于这个原因,我养成了写 type const 的习惯,但这似乎让其他程序员(对语言没有很好的掌握)发疯了。我实际上认为标准应该规定将 const 放在前面是过时的并最终取缔它。
    • @JimBalter:我个人使用这两种形式。我通常会根据上下文选择可读性更好的内容。可能这会让更多的程序员发疯:)
    • @cirronimbo 查看我编辑的评论。关键是扩展是结构性的,而不是文本的,因此分组是不同的。
    【解决方案2】:

    ptr1const (char *),表示指针本身是const,而ptr2(const char) *,表示指针的目标是const。

    【讨论】:

      【解决方案3】:

      这与 c 在内部对事物进行分组的方式有关。 typedef 不像宏,它不只是替换里面的东西。如果你要在里面加上括号,它看起来像这样。

      const (char*) ptr1 = "pointer";
      (const char)* ptr2 = "pointer";
      

      【讨论】:

        【解决方案4】:

        这样写:

        typedef char* c;
        c const ptr1 = "pointer";
        ++ptr1; /// error
        char const* ptr2 = "pointer";
        ++ptr2; /// runs fine
        

        使差异更加明显,这应该与您的示例相同

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-03
          • 1970-01-01
          • 2021-09-05
          • 1970-01-01
          • 2011-01-14
          相关资源
          最近更新 更多