在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 ...