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 模块?