對min a,b 這個巨集的討論

2021-07-24 11:18:05 字數 2090 閱讀 1379

在gcc的文件中建議使用如下的min巨集定義: 

#define min(x,y)  \ 

(__extension__  \ 

() \ 

)  本文討論了這樣作法的意義。 

1、傳統的min帶來的***

2、gcc中的()的擴充套件

3、typeof(expression)

4、__extension__的含義

5、使用typeof和({})實現min,避免了***

附錄1、舊版本的的gcc中的的解決方法

附錄2、c++中使用template的解決方法

1、傳統的min帶來的***

min通常被定義成這樣的巨集: 

#define min(x,y) ((x) < (y) ? (x) : (y))

這種定義會帶來一些***,看下面的例子: 

int x = 1, y = 2;

int main()

執行完min(x++、y++),我們期望x的值為2,y的值為3。 

但是,實際的結果是,執行完mini(x++、y++)後,x的值為3,y的值為3,原因在於巨集展開後x++被執行了兩次: 

引用: 

int x = 1, y = 2;; 

int main() 

2、gcc中的()的擴充套件

()是乙個表示式,逗號表示式類似,但是功能更強,()中可以包含有多條語句(可以是變數定義、複雜的控制語句),該表示式的值為statement list中最後一條語句的值,舉例:

int main()

)printf("result=%d\n", result);

}執行結果:

result=5050

3、typeof(expression)

typeof(expression)用來獲取expression的型別,舉例: 

int main()

4、__extension__的含義

gcc引入了很多標準c中的沒有的擴充套件,如(,gcc提供了pednatic選項用於檢測程式是否使用了gcc的擴充套件,當使用pedantic選項編譯如下程式時 

int main()

)printf("result=%d\n", result);

}編譯器發出警告: 

$ cc -pedantic test.c

test.c: 在函式 『main』 中:

test.c:9: 警告:iso c 不允許在表示式中使用花括號組

編譯器提醒程式設計師,這段c程式使用了不符合iso c標準的語法,如果使用其他的編譯器(非gcc)編譯這段**有能會出錯。在所有使用gnu 擴充套件關鍵字的表示式之前加__extension__ 關鍵字後,使用pedantic選項編譯時,編譯器就不再發出警告資訊: 

int main()

)printf("result=%d\n", result);

}$ cc -pedantic test.c

$ 編譯成功!

5、使用typeof和({})實現min,避免了***

#define min(x,y) \

() 使用傳統的min會出現問題的例子: 

int x = 1, y = 2;;

int main()

它被擴充套件為 

引用: 

int x = 1, y = 2;; 

int main() 

)[/color] 

); printf("x = %d, y = %d\n", x, y); 

} 在執行min(x++, y++)期間,x++和y++只執行了一次,因而結果是正確的。 

附錄1、舊版本的的gcc中的的解決方法

舊版本的gcc提供了兩個內建的運算操作符:<?和》?, <?返回兩個運算元中較小的乙個,>?返回兩個運算元中較大的乙個,使用這兩個操作符定義的min如下: 

#define min(x, y) ((x) <? (y))

#define max(x, y) ((x) >? (y))

附錄2、c++中使用template的解決方法

template

type min(type a, type b) 

{ return a < b ? a : b; 

對 jsvm討論 的了解

用了這麼久的jsvm,還真沒去真正的去了解過她.今天在論壇裡看看,雖然對自己沒有實質的提高,但我對她有了一些初步的了解,也有興趣繼續學習一下,這其中還有太多讓我學習的東西,或者說我根本就還不懂什麼叫jsvm,這樣的情況對自己,對工作沒有一點好處 1,有人接受jsvm,當然也有人不願接受.2006年2...

關於DBA或SA這個職業的討論

資料庫管理員,dba。實際上就是做下列工作的人 資料庫伺服器安裝和公升級,常用資料庫有oracle sybase db2 mysql等,並要跟蹤和聯絡廠商,跟蹤技術資訊 定義作業系統的使用規則,為資料庫定製最佳環境 為應用建立資料庫儲存結構,管理資料的儲存 為應用建立資料庫邏輯結構,如tables ...

關於DBA或SA這個職業的討論

資料庫管理員,dba。實際上就是做下列工作的人 資料庫伺服器安裝和公升級,常用資料庫有oracle sybase db2 mysql等,並要跟蹤和聯絡廠商,跟蹤技術資訊 定義作業系統的使用規則,為資料庫定製最佳環境 為應用建立資料庫儲存結構,管理資料的儲存 為應用建立資料庫邏輯結構,如tables ...