GNU C 编译器内部/GCC 技巧 4 1
外观
每个结构的 toString() 方法,如 Java 中的
[编辑源代码]从函数中调用代码块,如 Ruby 中的
[编辑源代码]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
当使用一个变量时,调用它初始化的函数。
函数参数的默认值,如 C++ 中的
[编辑源代码]void func(int a=0) { printf("a=%d\n", a); } int main() { func(); } > syntax error before '=' token
C++ 中的引用参数
[编辑源代码]void test(int &a, int &b); int x,y; test(x,y);
目标文件中的 GCC 开关
[编辑源代码]目标文件中的 GCC 开关用法:/usr/local/bin/paster serve [选项] CONFIG_FILE [启动 | 停止 | 重启 | 状态] 服务所描述的应用程序
如果给出启动/停止/重启,它将启动(正常操作)、停止(--stop-daemon)或执行两者。你可能还想使用 ``--daemon`` 来停止。
选项
-h, --help show this help message and exit -v, --verbose -q, --quiet -nNAME, --app-name=NAME Load the named application (default main) -sSERVER_TYPE, --server=SERVER_TYPE Use the named server. --server-name=SECTION_NAME Use the named server as defined in the configuration file (default: main) --daemon Run in daemon (background) mode --pid-file=FILENAME Save PID to file (default to paster.pid if running in daemon mode) --log-file=LOG_FILE Save output to the given log file (redirects stdout) --reload Use auto-restart file monitor --reload-interval=RELOAD_INTERVAL Seconds between checking files (low number can cause significant CPU usage) --status Show the status of the (presumably daemonized) server --user=USERNAME Set the user (usually only possible when run as root) --group=GROUP Set the group (usually only possible when run as root) --stop-daemon Stop a daemonized server (given a PID file, or default paster.pid file)
[app:main] use = egg:PasteEnabledPackage option1 = foo option2 = bar
[server:main] use = egg:PasteScript#wsgiutils host = 127.0.0.1 port = 80 sudo update-rc.d startup.sh defaults
运行时的类型信息
[编辑源代码]C 语言中没有运行时可用的类型信息。这个想法是允许程序在运行时获取结构体字段的名称和偏移量、枚举声明的符号名称等等。例如,而不是写
enum tree_code code; ... switch (code) { case VAR_DECL: printf("VAR_DECL\n"); break; case BLOCK: printf("BLOCK\n"); break; ... }
可以写
printf("%s\n", type_info(code).name);