GNU C 編譯器內部/GCC 駭客
外觀
此示例以前曾介紹過。
Linux 中的列表實現允許在列表的每個元素上呼叫程式碼塊。
list_for_each_prev(pos, head) {
struct nfs_page *p = nfs_list_entry(pos);
if (page_index(p->wb_page) < pg_idx)
break;
}
list_for_each_prev 將括號中的程式碼作為引數。技巧是使用一個宏,該宏展開成一個 for() 迴圈,其迴圈體成為括號中的程式碼。該專案的目的是允許程式設計師在函式呼叫中使用程式碼塊。
C 允許解除引用函式的返回值,如果它是指向結構的指標。
get_struct()->field=0;
如果函式返回結構本身,而不是指向它的指標,則會生成編譯時錯誤。
get_struct().field=0; > request for member `field' in something not a structure or union
此擴充套件解決了解除引用作為返回值的結構的問題。
當定義並初始化變數時,初始化器是常量。如果嘗試使用函式,無論該函式是什麼,都會出現錯誤。
int getint() { return 1; }
int i=getint();
> initializer element is not constant
當使用變數時,會呼叫它使用初始化的函式。
void func(int a=0) {
printf("a=%d\n", a);
}
int main() {
func();
}
> syntax error before '=' token
void test(int &a, int &b); int x,y; test(x,y);
GCC 4.1 實現了一種針對緩衝區溢位攻擊的保護機制,並透過 -fstack-protector 選項將其公開給程式設計師。這是一個模組化實現受益的功能示例,因為它與編譯器的核心功能無關。GCC 是否有足夠的鉤子來實現 -fstack-protector 模組?