【问题标题】:How to use VC++ compiler flags to specify enum size如何使用 VC++ 编译器标志来指定枚举大小
【发布时间】:2016-09-04 09:42:05
【问题描述】:

我有一个在两个平台上编译的 C++ 代码库,其中之一是 Visual C++ 2013。 第二个平台支持 C++03(而不是 C++11)。第二个平台的编译器中的枚举大小实现是使用所需的最小大小。 VC++ 实现是使用 4 个字节,即使它们不需要。

我想让 VC++ 也将枚举编译为最小大小,而不修改代码。例如,另一个编译器不会编译这个:

enum MyEnum : unsigned char {};

我进行了搜索,但找不到支持此功能的编译器标志。 它们存在吗?

【问题讨论】:

  • 这上面写满了可怕的想法。
  • @CaptainObvlious 我可以想象,在不了解任何背景、要求或理性的情况下,您会觉得您有足够的数据来得出结论。它与问题本身的质量有什么关系?
  • 是的,我可以得出结论,这有可能破坏很多东西。在全局范围内更改 enum 的大小会影响一切。这意味着enum 的定义在您的代码所期望的和原始代码所期望的之间更改。如果您是针对源代码构建的,那么如果您只是链接到库,那么问题就不那么明显了。如果期望大小,任何依赖它的代码都可能会中断。希望查看 all enum 类型的使用情况,然后在您更新到较新的库时重新查看。
  • @CaptainObvlious 感谢您的 cmets。我完全了解这些。我的用途不是用于生产代码,而是用于分析嵌入式内存转储。所有代码都是我团队内部的。不涉及任何库。如果枚举大小可以不在全局范围内而是在文件级别上完成,那就更好了,但如果全局范围是编译器标志可以做的,那就这样吧。但是,我没有看到任何关于如何在编译器级别执行此操作的建议。

标签: c++ visual-c++ visual-studio-2013 enums c++03


【解决方案1】:

C++03 必须理解枚举常量的显式类型:

enum Enumeration 
#if __cplusplus >= 201103L
  : unsigned char
#endif
{
   ONE = unsigned char(1), // storage type for enum is unsigned char
   ...
}

【讨论】:

  • 谢谢。但是,我想避免为每个枚举明确说明其所需的类型,因为额外的工作和潜在的错误 - 如果我向枚举添加一个很大的值,它可能会中断。
  • 这是一个非常好的建议,尽管您可以先执行#define ENUM_SIZE : unsigned char 然后enum Enumeration ENUM_SIZE { }; 之类的操作
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
相关资源
最近更新 更多