【问题标题】:Typedef enum in C++C++ 中的 Typedef 枚举
【发布时间】:2017-04-05 10:29:30
【问题描述】:

我有一个这样的 typedef

typedef enum
{
ONE = 01,
TWO = 02,
THREE = 03
}number_t;

我刚刚定义了一个成员变量为 number_t m_number;

所以,如果我在任何其他函数中返回 m_number,将返回 ONE、TWO 或 THREE 什么?

【问题讨论】:

  • 这是C语法,改成enum number_t { ONE = ... };或者更好的enum class number_t { ONE = ... };
  • 如果我在任何其他函数中返回 m_number 将返回什么 -- 未定义的行为,因为您没有初始化 m_number。
  • 是的,你是对的。我是 C++ 编码的新手,所以我该如何初始化那个 m_number
  • @zett42 它也是 C++ 语法。但是类型别名确实是多余的。
  • 警告:当您到达08 时,您会感到震惊,如果您跳到010 则更是如此。除非您真的打算以八进制计数,否则不要在整数文字上使用前导零。

标签: c++ variables enums typedef member


【解决方案1】:

由于你没有初始化变量,它有一个不确定的值

因此它可能是映射到ONETWOTHREE 或任何其他值的整数之一。

enum 对象具有不映射到枚举器的值本身并没有错,所以这不是一个大问题。但是,您不能合法地评估不确定的值,因此在您为其分配值之前,您将无法安全地观察该对象。

顺便说一句,当您访问 08 时,您会感到震惊,如果您跳到 010,则更是如此。除非您真的打算以八进制计数,否则不要在整数文字上使用前导零。

这是你应该做的:

enum number_t
{
   ONE   = 1,
   TWO   = 2,
   THREE = 3
};

number_t number = ONE;

【讨论】:

    【解决方案2】:

    就像任何其他局部变量一样,如果它没有被您的代码初始化,那么内容将是堆栈上的任何内容,在这种情况下是完全随机的。

    如果您想确定该值将是什么,然后在使用前对其进行初始化,请在您的枚举中添加如下内容:

    NUMBER_NOT_SET = 0
    

    然后进入你的功能:

    number_t m_number = NUM​​BER_NOT_SET;

    【讨论】:

    • “内容将是堆栈中的任何内容” 不一定。该值是不确定的,不必来自堆栈中的任何内容。
    • @BoundaryImposition,当然,这是教科书的定义,但是在我使用过的 99% 的编译器上都是这种情况。
    • @SP​​​​​​​​​​​​​latten:我很好奇你是如何测量/确定的。
    • @BoundaryImposition,自 1987 年以来的多年经验,在各种平台上使用各种编译器。所有局部变量都在栈上创建,如果没有提供值,则使用栈中的内容。
    • 我在问您如何确定您看到的是堆栈的内容,而不是简单地从其他地方确定值。你检查程序的汇编和虚拟内存空间的原始内容了吗?我之所以这样问,是因为对于像这样的简单变量,您的对象通常甚至不会在 on 堆栈中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 2013-12-23
    • 1970-01-01
    • 2010-10-16
    • 2011-02-17
    相关资源
    最近更新 更多