我想在#if預定義變數的浮點(或字串)值上設定條件。
正如我所看到的,如果預定義變數的值是一個整數,那么#if運行良好。但是,如果它是浮點數或字串,則 if 無法按預期作業。
例如:
#define _VER_ = 103
#if _VER_ == 103
//Do somthing
#endif
上面的代碼按預期作業,#if根據_VER_值變為活動/不活動。但是,如果該_VER_值將被設定為1.0.3或"1.0.3"將#if不會按預期作業。
例如:
#define _VER_ = 1.0.3
#if _VER_ == 1.0.3
//Do somthing
#endif
或這個:
#define _VER_ = "1.0.3"
#if _VER_ == "1.0.3"
//Do somthing
#endif
兩個代碼示例都沒有按預期作業,#if無論_VER_值如何,都保持不活動狀態。
如何使其正常作業?
uj5u.com熱心網友回復:
前處理器根本無法進行字串比較,并且#if標準也不支持指令中的浮點值。但是,即使他們比較浮點數,由于舍入問題總是很關鍵(請記住,您甚至無法完全表示許多像 0.1 這樣的簡單數字,因為它們在二進制中是周期性的),請參見例如此處或此處,因此您無法進行比較也可以安全地使用浮點數(很可能這就是不支持它們的原因......)。
但是,您可以做的是具有三個不同的整數值:
#define MAJOR 1
#define MINOR 0
#define REVISION 3
現在您可以分別對這些單個值進行比較,例如:
#if MAJOR > 1 || MAJOR == 1 && MINOR > 0
// anything after 1.0.x
您還可以做的是通過適當地移動它們將這些值組合成一個整數值,例如
#define VERSION MAKE_VERSION(MAJOR, MINOR, REVISION)
#define MAKE_VERSION(X, Y, Z) MAKE_VERSION_(X, Y, Z)
// intermediate step necessary to resolve the version parts correctly
#define MAKE_VERSION_(X, Y, Z) (X ## lu << 16 | Y ## lu << 8 | Z ## lu)
添加lu后綴:long由標準保證足夠大,以便移動 16 位將適合型別(這不能保證int!)。您可以嘗試使用其他偏移量來使結果適合 int,然后省略后綴(例如移動 8 或 12 而不是 16)或允許更多子版本(例如移動 20 而不是 16)。
乘以 10000 和 100 也可以解決問題,并導致更易讀的版本號(至少是十進制表示法)。
最后,您可以通過另一個宏創建版本字串:
#define VERSION_STRING MAKE_VERSION(MAJOR, MINOR, REVISION)
#define MAKE_VERSION(X, Y, Z) MAKE_VERSION_(X, Y, Z)
// intermediate step needed for correct stringification
#define MAKE_VERSION_(X, Y, Z) #X "." #Y "." #Z
邊注:
#define _VER_ = 103
完全錯誤的原因有兩個:
- 前處理器只做純文本處理,不知道任何 C 代碼。賦值符號 (
=) 將包含在您使用它的任何位置的文本替換中(因此#if _VER_ == 103將擴展為#if = 103 == 103)。 - 以下劃線開頭后跟大寫字符的識別符號是保留的,使用它們會導致未定義的行為(注意:帶有兩個后續下劃線的識別符號 – 任何地方 – 也是如此)。
uj5u.com熱心網友回復:
無論如何,您可以以最有意義的方式拆分版本,即:
#define VERS_MAJOR 1
#define VERS_MINOR 0
#define VERS_PATCH 3
然后進行前處理器比較,例如:
#if (VERS_MAJOR == 1) && (VERS_MINOR == 0)
...
如果您需要獲取1.0.3作為輸出,則將其轉換為字串文字:
#define STR(x) #x
#define STR_VERSION(a,b,c) STR(a) "." STR(b) "." STR(c)
#define VERSION STR_VERSION(VERS_MAJOR,VERS_MINOR,VERS_PATCH)
...
puts(VERSION); // prints 1.0.3
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/336492.html
標籤:C
上一篇:檢測輸入是字符還是數字
