From: Arnd Bergmann > Sent: 23 September 2020 19:46 ... > Regardless of that, another advantage of having the SYSCALL_DECLAREx() > would be the ability to include that header file from elsewhere with a > different > macro definition to create a machine-readable version of the interface when > combined with the syscall.tbl files. This could be used to create a user > space stub for calling into the low-level syscall regardless of the > libc interfaces, > or for synchronizing the interfaces with strace, qemu-user, or anything that > needs to deal with the low-level interface.
A similar 'trick' (that probably won't work here) is to pass the name of a #define function as a parameter to another define. Useful for defining constants and error strings together. eg: #define TRAFFIC_LIGHTS(x) \ x(RED, 0, "Red") \ x(YELLOW, 1, "Yellow) \ x(GREEN, 2, "GREEN) You can then do thing like: #define x(token, value, string) token = value, enum {TRAFFIC_LIGHTS(x) NUM_LIGHTS}; #undef x #define x(token, value, string) [value] = string, const char *colours[] = {TRAFFIC_LIGHTS(x)}; #undef x to initialise constants and a name table that are always in sync. It is also a good way to generate source lines that are over 1MB. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)