在我的代碼庫我有沒有基礎類型類似下面無範圍的枚舉:與protobuf的枚舉替換C++枚舉
enum EFoo {
EF_AAA = 0,
EF_UNKNOWN = 1,
EF_BBB = 2,
EF_MAX
}
我想使它成爲一個protobuf的枚舉,因此它可以在其他protobuf的消息直接作爲被重用枚舉,而不是某種int*
字段。所以我想象.proto文件中的枚舉聲明將如下所示:
enum EFoo {
EF_AAA = 0;
EF_UKNOWN = 1;
EF_BBB = 2;
}
這裏是一個棘手的部分。隨着時間的推移,可能會添加新的字段,如EF_CCC = 3
,所以我不能像聲明EF_MAX
那樣聲明C++代碼,因爲它會破壞包含EFoo
類型字段的序列化消息的二進制兼容性。並且EF_MAX
用於整個代碼庫中的API,因爲類型EFoo
和EF_MAX
變量的未知值從未序列化。然而,int
類型的EFoo_ARRAYSIZE
其語義含義正好是EF_MAX
。所以我正在考慮用EFoo_ARRAYSIZE
替換所有EF_MAX
,但有一件事情讓我困擾,它需要在某些地方做static_cast<EFoo>(EFoo_ARRAYSIZE)
以避免編譯器警告,根據標準它將被視爲未定義的行爲,這可能會導致討厭的優化和錯誤。
而我的問題是,我該如何解決我的問題?或者,也許我錯了,我的解決方案與static_cast<EFoo>(EFoo_ARRAYSIZE)
全部替換EF_MAX
是安全的嗎?
萬一它可能很重要,我在談論C++ 11標準。
「從協議緩衝區文檔」 - 鏈接? –
真的嗎?我需要爲您的谷歌「協議緩衝區文件」?確定這裏是:https://developers.google.com/protocol-buffers/docs/proto3#enum –
我認爲適當添加一個特定的引用盡可能直接引用,特別是如果它可以幫助讀者知道規範的來源,以及未來的發展方向。特別是如果有人剛剛瞭解這個問題(畢竟這是很多人的想法)。考慮將其添加到您的帖子。 –