Template:GNU C Compiler Internals/GCC Hacks

Invoke a block of code from a function as in Ruby
Linux implementation of lists allows to invoke a block of code on each element of the list:

pagelist.c:

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 takes the code in the brackets as a parameter. The trick is to use a macro that rolls out to a for loop whose body becomes the code in the brackets. The goal of this project is to allow programmers to use code blocks in function calls.

Dereference function results when a structure is returned
C allows one to dereference the return value of a function if it is a pointer to a structure:

get_struct->field=0;

If the function returns the structure, not a pointer to it, then a compile-time error is generated:

get_struct.field=0; > request for member `field' in something not a structure or union

This extension addresses the problem of dereferencing structures that are return values.

Use functions to initialize a variable
When a variable is defined and initialized the initializer is constant. You will get an error if you try to use a function, no matter what this function is:

int getint { return 1; } int i=getint; > initializer element is not constant

When a variable is used the function it was initialized with is called.

Default values of function arguments as in C++
void func(int a=0) { printf("a=%d\n", a); } int main { func; } > syntax error before '=' token

Reference parameters as in C++
void test(int &a, int &b); int x,y; test(x,y);

GCC switches in object file
GCC switches in object fileusage: /usr/local/bin/paster serve [options] CONFIG_FILE [start|stop|restart|status] Serve the described application

If start/stop/restart is given, then it will start (normal operation), stop (--stop-daemon), or do both. You probably want ``--daemon`` as well for stopping.

Options: -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

Type information at run-time
There is no type information in C language available at run-time. The idea is to allow program to get the names and offsets of a structure's field at run time, the symbolic name of an enum declaration, etc. For example, instead of writing

enum tree_code code; ...  switch (code) { case VAR_DECL: printf("VAR_DECL\n"); break; case BLOCK: printf("BLOCK\n"); break; ...  }

one could write

printf("%s\n", type_info(code).name);