【问题标题】:What does this mean? typedef uint64_t uint64_t;这是什么意思? typedef uint64_t uint64_t;
【发布时间】:2021-02-08 18:50:27
【问题描述】:

什么意思:

typedef uint64_t uint64_t;

我在全局命名空间中的纯源代码中找到了它,而不是经过预处理的源代码。如果将来应该使用其他类型,它可以只是一个占位符吗?

【问题讨论】:

  • 无上下文难说,请发minimal reproducible example
  • 在给定的非类范围内,typedef 说明符可用于重新定义在该范围内声明的任何类型的名称,以引用它已经引用的类型。(来自 C++17 标准草案)。不知道这实际上是什么意味着。
  • 这是一个合法的结构——见timsong-cpp.github.io/cppwp/n3337/dcl.typedef#3。目前还不清楚为什么有人会这样做。
  • 这没有任何意义。这行代码存在的原因有1001种可能的解释,但是没有用。
  • 它是否被包含在命名空间中?将等效定义从外部范围拉到内部范围是一种有效的方法。例如,这就是 cstdint 将这些别名放入 std 命名空间的方式。

标签: c++ typedef


【解决方案1】:

typedef 与 C/C++ 中的常规变量具有相同的作用域。

所以,它是作用域的。在每个范围内,我们都可以定义一个新的含义。但是,如果它在那个范围内有意义,它就不能被重新定义。也不使用范围运算符::

#include <cstdint>
#include <iostream>
int main() {
    {
        typedef uint64_t unit64_t;
        std::cout << typeid(uint64_t).name() << '\n';
    }
    {
        typedef char uint64_t;
        std::cout << typeid(uint64_t).name() << '\n';

        typedef uint64_t unit64_t;  // Still a char
        std::cout << typeid(uint64_t).name() << '\n';

        // typedef ::uint64_t unit64_t; // Error
        // std::cout << typeid(uint64_t).name() << '\n';
    }
    {
        typedef uint64_t unit64_t;
        std::cout << typeid(uint64_t).name() << '\n';
    }
    return 0;
}

所以,我倾向于说,这是没有意义的,是一个相当学术的问题。

但我几乎可以肯定有人会找到用例。

【讨论】:

    猜你喜欢
    • 2014-01-24
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 2023-03-10
    相关资源
    最近更新 更多