簡體   English   中英

預處理程序相等性測試,這是標准嗎?

[英]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.

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