[英]Preprocessor equality test, is this standard?
我已經在項目偏好中設想了其中一種
TESTING
= HOST
TESTING
= TARGET
TESTING
我的問題是后者。
似乎不是
#if TESTING==HOST
#error "HOST defined" // add temporarilly for testing porpoises
#endif
我需要編碼
#ifdef TESTING
#if TESTING==HOST
#error "HOST defined" // add temporarilly for testing porpoises
#endif
#endif
我堅信這不是標准行為,因為如果未定義TESTING
那么它肯定不等於HOST
,並且我不需要GCC編譯器進行額外的#ifdef TESTING
。
但是,當我使用Atmel AVR Studio(我認為它基於MS Visual Studio)時,有必要在幾十個地方添加該初始#ifdef TESTING
:-(
看來我別無選擇,但我只是想知道是否任何C標准都要求這樣做。
#if TESTING==HOST
如果未定義“ TESTING
,則
它等效於:
#if 0==HOST
從C標准:
(C99,6.10.1p4)“在執行了由於宏擴展和定義的一元運算符引起的所有替換之后,所有剩余的標識符(包括在詞法上與關鍵字相同的那些標識符)都被替換為pp-number 0””
請注意,您可以執行以下操作:
#ifndef TESTING
...
#elif TESTING == HOST
...
#elif TESTING == TARGET
...
#else
#error "Unexpected value of TESTING."
#endif
也:
#if defined(TESTING) && TESTING == HOST
...
#endif
如果要折疊測試。 括號是可選的( #if defined TESTING
有效),但我認為將它們包括在內更加清晰,尤其是當您開始添加其他邏輯時。
原始C預處理程序在使用符號之前需要顯式的#ifdef
驗證。 假設未定義符號具有默認值是一種相對較新的創新(可能是由諸如Javascript之類的腳本語言驅動的)。
為什么不總是確保定義了符號?:
#ifndef TESTING
#define TESTING (default value)
#endif
#if TESTING==HOST
...
#elif TESTING==TARGET
...
#else
...
#endif
替代方案,也許強制選擇?
#ifndef TESTING
#error You must define a value for TESTING
#endif
我有同樣的問題。 如果沒有定義#if參數,那曾經是編譯器會報錯的。 我已經學會了不再是這樣的艱難方式。 我想出的解決方案如下:
#define BUILDOPT 3
#if 3/BUILDOPT == 1
<compile>
#endif
如果未定義BUILDOPT,則會得到除以0的編譯錯誤。如果BUILDOPT!= 3 &&> 0,則#if失敗。
我的最終實現是將BUILDOPT設置為1以啟用代碼,> 1禁用。 然后,#if變為#if 1 / BUILDOPT == 1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.