簡體   English   中英

使用宏強制預處理器錯誤

[英]Forcing preprocessor error with macro

有沒有一種方法可以強制C ++中的預處理器宏發出錯誤? 我想做的就是定義一個UNKNOWN宏。 我正在為機器人編寫一些代碼,但我還不知道所有電子設備的插入位置。我希望能夠在某些頭文件中定義端口,例如

const int MOTOR_PORT = 1;
const int FAN_PORT = 2;
//etc.

但是,當我到達一個尚不知道的端口時,我希望能夠寫類似

const int LED_PORT = UNKNOWN;

在調試模式下, UNKNOWN只會被定義為某個任意值,例如0。但是,在發布模式下進行編譯時,我希望在使用UNKNOWN時拋出錯誤,以便未分配的端口不會最終發布。 我知道我可以使用#error指令強制執行錯誤,但是我可以在宏中執行類似的操作嗎?

我已經看到了使用static_assert的解決方案,但不幸的是,我無法在該平台上使用C ++ 11。

由於#error不能由宏擴展引起,因此可以確保宏擴展為必須診斷的內容,例如語法錯誤。

例如:

#ifdef RELEASE
#define UNKNOWN @Invalid_use_of_UNKNOWN
#else
#define UNKNOWN 0
#endif

const int MOTOR_PORT = 1;
const int FAN_PORT = 2;
const int LED_PORT = UNKNOWN;

int main(void) {
    int x = LED_PORT;
}

@字符不是C的基本字符集的一部分,因此它在注釋,字符常量或字符串文字之外的外觀應始終導致錯誤消息。 $可以工作,除了在標識符中接受$是常見的擴展名`可能也可以工作,但是@更好。)

我已經定義了宏,因此它會在gcc上產生合理的錯誤消息:

c.c:9:1: error: stray ‘@’ in program
c.c:9:22: error: ‘Invalid_use_of_UNKNOWN’ undeclared here (not in a function)

和c聲:

c.c:9:22: error: expected expression
const int LED_PORT = UNKNOWN;
                     ^
c.c:2:17: note: expanded from:
#define UNKNOWN @Invalid_use_of_UNKNOWN
                ^
1 error generated.

(有一個_Pragma運算符與#pragma指令相對應。如果也有_Error運算符,但是沒有_Error會很好。)

好吧,這不會產生像#error這樣的編譯器錯誤消息,但是會在調試時編譯而在發布時失敗:

#ifdef _DEBUG
#   define UNKNOWN 1
#else
#   define UNKNOWN
#endif
const int port1 = UNKNOWN; // fail in release

您可以將其除以零,這將引發編譯器錯誤: #define UNKNOWN 0/0

sizeof運算符不能應用於不完整的類型,因此請嘗試以下操作:

// Declared, but not defined anywhere.
struct illegal_use_of_unknown_macro;
#define UNKNOWN (sizeof (illegal_use_of_unknown_macro))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM