0

私は複雑なC構造のDATABSECONTEXTを持っています。 開発者は、この構造に異なるフィールドを追加し続けます。私たちは見直しして受け入れます。しかし時には同期の欠如があります。 複雑なルーチンfunction1()があり、異なるフィールドにアクセスして処理する必要があります。したがって、もしfunction1()で気にかけられていなければ、構造体に新たに追加されたフィールドがあれば、それはNULLのままになります。これは一貫性のない状態であり、後でクラッシュを引き起こします。Cの構造体にフィールドを追加する際に開発者に警告する方法、関連する関数を見直したりレビューする方法はありますか?

このDATABSECONTEXT構造体にいくつかのフィールドが追加されると、関連する関数function1()を再訪問するために、開発者に強制アラート/メッセージのメカニズムが必要です。

私はfunction1()で触れる各フィールドのマクロを持つヘッダーファイルを維持することを考えました。私は

headerfile1.h 

    #define dbCurrency_funciton1 

field definition macro inside the structure can be modified as: 

headerfile2.h 
    #define funname restruc 
    #define PASTER(x,y) x ## _ ## y 
    #define NAME(fun) PASTER(fun, funname) 

    #define MY_ELEMENT(dtype, mname) dtype mname;\ 
             #ifndef (NAME(mname)) \ 
             #error "please visit funciton1() and add macro @NAME(mname) in headerfile.h" 
             #endif 

    struct DATABSECONTEXT 
    { 
    MY_ELEMENT(char, newlyAddedElement); 
    }; 

を行うことができます)(FUNCTION 1で使用されるフィールドdbCurrencyのために言うが、プリプロセッサディレクティブのような使用は、マクロでは許可されません。

以下のリンクをたどっていますが(それ以上)、私のために何かを見つけることができませんでした。 Link1Link2

これをどのようにエレガントに達成するための提案ですか?

+0

の下、みんなで記載される特定の例カバレッジを保証するものではありません。 – lilezek

+1

古いコンパイラを使用している場合は、ネイティブまたはロールのいずれかの構造体のサイズに対して[静的アサート](https://stackoverflow.com/questions/3385515/static-assert-in-c)を使用できます。 – unwind

+1

マクロを使用するのではなく(不器用な、あるいは決定した開発者が適切に使用しないかもしれない)、 'function1()'のソースコードとヘッダーファイルを入力し、データ構造のすべてのメンバーの値をヘッダーに指定されています。設定されていないメンバーがある場合は、適切なメッセージを出力し、エラー状態で終了します。次に、ヘッダーファイルが変更されるたびにそのプログラムを実行するようにビルドスクリプトを設定します。 [必要であれば、そのプログラムチェック前処理されたソース]。 – Peter

答えて

0

実行時に確認できる場合は、構造体のサイズを予想されたサイズとすることができます。誰かが新しいフィールドを追加すると、サイズが変わるので、function1とsizeを更新する必要があることを知らせるエラーを発生させることができます。


編集:このソリューションは、あなたが期待されるように、そのサブルーチンの部分がまだ働いているかどうかを確認するユニットテストを書くことができ

+0

実行時にそれをする必要はありません。静的アサーションで 'sizeof'を使うことができます。 – user694733

+3

新しいメンバーを追加するとデータ構造のサイズが変更されることがありますが、これは保証されません。新しいメンバが小さい場合(特に既存の埋め込みに適合する場合)、パディングとアライメントが干渉する可能性があります。 – Peter

+0

@ピーター正確には、構造のサイズはプラットフォームによって異なる場合があります。それがコードメンテナンスの増加のもう一つのポイントです。キックインするにはシステム依存の層が必要です。 – Yogesh

関連する問題