如何在 C 中实现作用域枚举

Bob*_*Bob 3 c enums

在 C++ 中你可以这样做

enum class Colors {black, blue, green, cyan, red, purple, yellow, white};
Colors mycolor;

mycolor = Colors::blue; // this is what I want to do
Run Code Online (Sandbox Code Playgroud)

在 中C,是否可以使用 来引用枚举EnumName::tag

Bas*_*tch 6

\n

在 C 中,是否可以使用 EnumName::tag 引用枚举?

\n
\n

不它不是。阅读C11标准,例如n1570草案(\xc2\xa76.7.2.2)

\n

在实践中,C 程序员有很多约定,例如对某些enum.

\n

例如,在GTK中,所有标签都以(按照人类惯例,通用前缀)enum GtkShadowType开头,例如和。这使得 C 代码对开发人员来说更具可读性,因为GTK很多s 。GTK_SHADOW_GTK_SHADOW_INGTK_SHADOW_OUTenum

\n

在某些情况下,您可以生成C 代码(使用SWIGGNU bison等软件或您自己的软件)。然后,您的 C 代码生成器还应该记录并采用生成的 C 代码的命名约定(特别是帮助人类开发人员从手写的名称中轻松识别生成的 C 名称)。

\n

在大型软件(例如Linux 内核)中,记录命名和编码约定非常重要。这有利于未来开发人员的工作。

\n

好的源代码编辑器(例如GNU emacs可以配置为通过很少的按键来输入长标识符,并且当前的 C 优化编译器在优化上花费的时间比在解析上花费的时间多得多,因此 2020 年之后,拥有长但可读的标识符在大型软件代码中非常重要基础(这不会显着影响编译时间或运行时)。

\n

不要忘记,只要小心,您可以混合 C 和 C++ 代码,并创建一个用 C++ 编码、具有 C 接口和 API 的库。libgccjit是一个很好的例子(使用它,您可以嵌入优化GCC在应用程序中请小心 C++ 异常:在从库返回之前应捕获所有异常。

\n

  • @AyxanHaqverdili 它仅在前缀中“尾随”,因此“GTK_SHADOW_FOO”而不是“GTK_SHADOWFOO”。 (2认同)