例如,我最近在 Linux 内核中遇到了这个问题:
/* Force a compilation error if condition is true */ #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
因此,在你的代码中,如果你有一些结构,比如说8字节大小的倍数,也许是因为一些硬件的限制,你可以这样做:
BUILD_BUG_ON((sizeof(struct mystruct) % 8) != 0);
它不会编译,除非 struct mystruct 的大小是8的倍数,如果是8的倍数,则根本不会生成任何运行时代码。
我知道的另一个技巧来自《 Graphics Gems 》一书,它允许单个头文件在一个模块中声明和初始化变量,而在其他模块中使用该模块,只是将它们声明为 externs。
#ifdef DEFINE_MYHEADER_GLOBALS #define GLOBAL #define INIT(x, y) (x) = (y) #else #define GLOBAL extern #define INIT(x, y) #endif GLOBAL int INIT(x, 0); GLOBAL int somefunc(int a, int b);
这样,定义 x 和 somfunc 的代码就可以:
#define DEFINE_MYHEADER_GLOBALS #include "the_above_header_file.h"
而仅使用 x 和 somfunc ()的代码可以:
#include "the_above_header_file.h"
因此,您可以得到一个头文件,该文件声明需要全局变量和函数原型的实例,以及相应的外部声明。
那么,你最喜欢的 C 编程技巧是什么呢?