<分区>
例如,我最近在 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”一书,它允许单个头文件在一个模块中同时声明和初始化变量,而在使用该模块的其他模块中,只需将它们声明为外部变量。
#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 和 somefunc 的代码就可以:
#define DEFINE_MYHEADER_GLOBALS #include "the_above_header_file.h"
虽然仅使用 x 和 somefunc() 的代码会:
#include "the_above_header_file.h"
因此您会得到一个头文件,该文件在需要的地方声明了全局变量和函数原型(prototype)的实例,以及相应的外部声明。
那么,您最喜欢的 C 编程技巧是什么?