#include <stdio.h>
#define ONE 3 > 2 ? 16 : 64
#define TWO ONE/16
int main () {
printf("%d
", TWO)。)
return 0;
}
我寫了兩個#define,但輸出是16,而我預期是1。
為什么會發生這種情況?
uj5u.com熱心網友回復:
宏是一個簡單的文本替換。當預處理程式通過代碼時,它會替換掉
printf("%d
", TWO)。)
與
printf("%d
", ONE/16)。)
然后用
printf("%d
", 3 > 2 ? 16 : 64/16)。)
這時編譯器可以看到三元運算子條件評估為真,并采取第一個結果--16。
你可能希望第一個宏被包裹在小括號中:
#define ONE (3 > 2 ? 16 : 64)
但我強烈建議盡可能避免使用宏。正如評論所建議的,
constexpr auto ONE = 3 > 2 ? 16 : 64;
會給你預期的結果。
uj5u.com熱心網友回復:
預處理程式只是一個簡單的文本替換。
如果你用手替換或者簡單地使用gcc -E選項(也許在其他編譯器上有所不同),你會得到:
#define TWO 3 > 2 ? 16 : 64/16
你所期望的可以通過使用大括號簡單地實作:
你所期望的是什么?
#define ONE (3 > 2 ? 16 : 64)
#define TWO ONE/16
BTW:你根本就不應該再使用宏,而應該用編譯時的常量運算式來代替它,比如:
constexpr auto ONE = 3 > 2 ? 16 : 64;
好處是,如果你做錯了什么,你會得到錯誤或警告,而且所有運算式都是型別安全的。如前所述,宏只是在做文本替換,而沒有對后來使用的語言進行任何語法檢查。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/306727.html
標籤:
