2012-02-20 75 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-c的答案中的技術之一,斷言表達式,在建造時,在-C。另外,你應該總是把宏參數放在paranthesis中,比如'(BQDATA)+(SIZE)+ 1',否則你會遇到運算符優先級的問題。 – 2012-02-20 23:08:25

回答

1

如果sizemax_bq_size是編譯時常量,則可以使用#define BQ(size, name)BUILD_BUG_ON(size > max_bq_size);。您沒有收到自定義消息,但至少有一個錯誤。

+0

這個宏無法形容哈克。幾乎所有最近的編譯器都有更好的選擇。 – 2012-02-20 23:13:32

+1

請注意,BUILD_BUG_ON()僅適用於函數內部 - 不適用於頂層聲明。 – 2012-02-20 23:34:14