5

私が抱えている問題は、同じ定数セットを持つ必要がある2つの異なるファイルに2つの列挙型があることです(2つの異なるプロセスが他のファイルと一緒に2つのファイルによって生成されます)。列挙型を同期させたい。つまり、誰かが列挙型 x に新しい値を追加し、他の列挙型を更新するのを忘れたときに、コンパイル エラーをスローしたい。それは可能ですか?

4

6 に答える 6

11

この宣言を 1 つのヘッダー ファイルに入れ、必要な 2 つの場所に含めないのはなぜですか?

于 2009-07-28T12:08:49.100 に答える
5

各列挙型は、LAST_ENUM_1 や LAST_ENUM_2 などの既知の列挙型で終了します。両方のヘッダー ファイルにアクセスできるファイルで #if を使用して比較します。

#if LAST_ENUM_1 != LAST_ENUM_2
   #error Enums have different sizes
#endif
于 2009-07-28T12:35:48.507 に答える
1

私は今提案するものよりも他の答えが本当に好きです...

他のすべての解決策がうまくいかない場合は、それらが同じかどうかをチェックする単純な perl スクリプトを作成し、perl スクリプトが makefile から呼び出されることを確認してください。問題は解決しますが、できれば避けてください。

于 2009-07-28T13:32:29.117 に答える
0

コンパイラは一度に1つのソースファイル(変換ユニット、TU)を参照するため、現在のTUと参照していない他のTUとの不一致について文句を言う方法はありません。

両方のプログラムで使用される列挙型の定義のコピーが1つになるように修正する必要があります。つまり、両方に含まれるヘッダーに属します。他のほとんどのものは、快適さのためにエラーが発生しやすいです。

于 2009-07-29T03:58:16.830 に答える
0

列挙型で使用される名前は明確である必要があるため、問題が発生します。コンパイラーが両方の定義にアクセスできる場合、名前の問題のために列挙型を同一にすることができないか、コンパイラーが 1 つの定義にしかアクセスできないかのいずれかです。時間の場合、チェックするものは何もありません。

(Robert が提案したように) 要素の数でさえ、コンパイル時にチェックすることはできません (プリプロセッサは列挙型について何も知りません)。1 つの共通ヘッダー ファイルを使用できない場合、最も簡単な方法は、アプリケーションの開始時に実行時チェックを行うことです。

于 2009-07-28T13:11:09.830 に答える
0

のように使う

enum EMyEnum
{
    JOE   = 0,
    BLACK = 1,
    WHITE = 2,

    END_OF_ENUM = 3
}

そのような形式を使用すると、おそらくすべてを簡単に処理できます

于 2009-07-28T13:16:32.383 に答える