枚举是否在未实例化时具有存储空间?

时间:2016-11-26 06:54:28

标签: c++ c enums macros c-preprocessor

如果我没有实例化枚举,只需要:

enum myEnum {val1 = 0,val2,val3};

我想知道所有编译器是否会执行所有代码并将val1,val2等替换为相应的数字。这意味着它不会在完成的程序中为它创建存储空间。实际上,无论你写val1,val2等等,最终结果都是常数值。

我不确定“实例化”是否是正确的词。此外,当我说它通过你的代码并替换东西时,我并不是说它会像预处理器阶段的宏替换那样粘贴它。感谢。

2 个答案:

答案 0 :(得分:1)

枚举的枚举数是prvalues,因此当您在源代码中使用42时,它类似于键入<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:popupTheme="@style/AppTheme.PopupOverlay"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/logo_1" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/logo_1" /> </android.support.v7.widget.Toolbar> 等文字;你没有得到一个glvalue(它指的是存储实际值的内存中的位置)。编译器在程序中为枚举器保留空间是没有任何意义的,因为根据语言规则永远不会访问那些内存位置。

然后,你真的如此缺乏记忆力吗?

答案 1 :(得分:1)

该标准将枚举描述为:

  

[...]具有命名常量的不同类型。

因此,是 - 最终结果将是在您编写val1,val2等的任何地方取代的常量值。