問題は2つの異なるファイルに2つの列挙型があり、同じセットの定数が必要です。他のファイルと)。列挙型を同期させたい、つまり、ある列挙型が列挙型に新しい値を追加し、他の列挙型を更新することを忘れた場合、コンパイルエラーをスローしたい。それは可能ですか?Cプログラム - コンパイル時に2つの列挙型が同期しているかどうかを調べる
答えて
なぜこの宣言を1つのヘッダーファイルに入れて、それを2つの場所に含める必要はありませんか?
各列挙型は、LAST_ENUM_1やLAST_ENUM_2などの既知の列挙型で終了している必要があります。両方のヘッダーファイルにアクセスできるファイルで#ifを使用して比較します。列挙型で使用
#if LAST_ENUM_1 != LAST_ENUM_2
#error Enums have different sizes
#endif
名は、明確である必要があり、あなたは問題があるでしょう:どちらかのコンパイラは、両方の定義にアクセスすることが、その後、列挙型が原因の名前の問題やコンパイラで同じにすることはできません1つの定義にしかアクセスできない場合は、チェックすることはありません。
(Robertによって提案されたように)要素の数さえコンパイル時にチェックすることはできません(プリプロセッサは列挙型について何も知らない)。本当に1つの共通ヘッダーファイルを持つことができない場合は、アプリケーションの開始時にランタイムチェックを行うのが最も簡単です。
あなたはその形式のように使用している場合は、多分あなたは私は本当に私が今sugestます1よりも良い他の回答のように...
私は '= 3'を最後に付けません。なぜなら、それは列挙型を追加するときに変更する必要があるからです。 – Robert
enum EMyEnum
{
JOE = 0,
BLACK = 1,
WHITE = 2,
END_OF_ENUM = 3
}
などの使用
他のすべてのソリューションがうまくいかない場合は、同じものかどうかをチェックする単純なperlスクリプトを作成し、makefileからperlスクリプトが呼び出されていることを確認してください。 これで問題は解決しますが、できれば回避してください。
コンパイラは一度に1つのソースファイル(トランスレーションユニット、TU)を調べるので、現在のTUとそれが見ていない他のいくつかのTUの間の不一致について不平を言う方法はありません。
両方のプログラムで使用される列挙型定義のコピーが1つあるように修正する必要があります。そのため、両方のプログラムで使用されるヘッダーに含まれています。他の何もかもが、あまりにもエラーを起こしやすくなります。
- 1. (C#)Mono.Cecilを使用して列挙型かどうかを調べる方法
- 2. コンパイル時に型がテンプレートクラスから派生しているかどうかを調べる方法は?
- 3. typeメンバーが列挙型かどうかを調べるにはどうすればよいですか?
- 4. C++プログラムのコンパイル時にエラーメッセージを調べ始める場所は?
- 5. 列挙型ではなく、列挙型クラスをいつどのように使うべきですか?
- 6. C#で2つの列挙型が等しいのはいつですか?
- 7. Greasemonkey - ページに2つの文字列があるかどうかを調べる
- 8. C 2つの単語がアナグラム(内部のコード)であるかどうかを調べるプログラム
- 9. オブジェクトの型がString型かどうかを調べる
- 10. Parse PFQuery - 配列が同一かどうかを調べる - Swift
- 11. 2つの配列に同じ要素があるかどうかを調べる再帰的方法
- 12. C#文字列内のすべての文字が同じであるかどうかを調べる
- 13. プログラムがサブプロセスでクラッシュしたかどうか調べるには?
- 14. LinuxのCプログラム:別のプログラムが実行されているかどうかを調べる方法
- 15. Haskell:型がクラスのインスタンスかどうかを調べるには?
- 16. 2つのダブルスがほぼ等しいかどうかを調べる方法
- 17. JSで2回の間に時間があるかどうかを調べる
- 18. Pythonで配列内の値を比較する方法 - 2つの値が同じかどうか調べる
- 19. ジェネリック型の配列がMaxHeapであるかどうかを調べるアルゴリズム
- 20. 配列が2次元配列にあるかどうかを調べる
- 21. IOSプロジェクトで2つのGoogleマップルートが交差しているかどうかを調べるには
- 22. C#:別の列挙型の内部に1つの列挙型をラップしています(つまり別の列挙型をコピー/コピーしています...)
- 23. 列挙型プログラム
- 24. コンパイル時に列挙型の値を確認する
- 25. 配列が美しいかどうかを調べる
- 26. 2つのオブジェクトの型が同じかどうかを確認
- 27. 型がインスタンス化可能かどうかを調べる
- 28. Python&Pandas:リスト型の列に何かが含まれているかどうかを調べる方法は?
- 29. 2つのテーブルを比較して列が一致するかどうかを調べる
- 30. はどのように列挙型に列挙型
コンパイル時にこのようなことができるかどうかを知りたいです。 –
私が知る限り、コンパイル時には不可能です。 gcc(またはあなたが使っているもの)を呼び出す前に、コーパスの前にプリプロセッサを書いて実行することができます。このプリプロセッサは、両方のファイルを生成し、一方を他方から生成する。 – Gregor
@Gregor、hmmm。コンパイル自体を開始する前に、関連宣言の複数のコピーを別々のフェーズとして生成することができます。 –