2012-02-20 7 views
1

引数の制限もチェックするマクロを定義したいと思います。たとえば、次のようにCのマクロでのパラメータチェック

typedef unsigned char Byte; 
#define BQDATA 3 
#define MAX_BQ_SIZE (255-BQDATA) 

#define BQ(SIZE,NAME) \ 
    #if SIZE > MAX_BQ_SIZE \ 
     #error BQ NAME exceeds maximum size \ 
    #endif \ 
    Byte NAME[BQDATA+SIZE+1] = {BQDATA,BQDATA,BQDATA+SIZE} 

それが発生した場合、だから:

BQ(300,bigq); 

フラグエラーをだろうこと。

+2

http://stackoverflow.com/questions/3385515/static-assert-in-cまたはhttp://stackoverflow.com/questions/174356/ways-to-への回答からテクニックの1つを実装できます。 assert-expressions-at-build-time-in-cを実行します。また、 '(BQDATA)+(SIZE)+ 1'のようにマクロ引数を常にparanthesisに入れるべきです。そうしないと、演算子の優先順位に問題が生じます。 –

答えて

1

sizeの場合とmax_bq_sizeあなたは#define BQ(size, name)BUILD_BUG_ON(size > max_bq_size);を使用することができますコンパイル時の定数です。カスタムメッセージは得られませんが、少なくともエラーはあります。

+0

そのマクロは言い切れないほどハッキリです。ほとんどの最近のコンパイラには、より良い選択肢が存在します。 –

+1

BUILD_BUG_ON()は関数内でのみ動作し、トップレベルの宣言では機能しません。 –