例如,我最近在linux内核中遇到了这个问题:
/ *如果条件为真,则强制执行编译错误* / #定义BUILD_BUG_ON(条件)((无效)sizeof(字符[1-2 * !!(条件)]))
因此,在您的代码中,如果您具有某种必须为8个字节大小的倍数的结构,可能由于某些硬件限制,您可以执行以下操作:
BUILD_BUG_ON((sizeof(struct mystruct)%8)!= 0);
除非struct mystruct的大小是8的倍数,否则它不会编译;如果它是8的倍数,则根本不会生成任何运行时代码。
我知道的另一个技巧是从“ Graphics Gems”一书中获得的,该书允许单个头文件在一个模块中声明和初始化变量,而在其他使用该模块的模块中,仅将其声明为externs。
#ifdef DEFINE_MYHEADER_GLOBALS #define GLOBAL #定义INIT(x,y)(x)=(y) #其他 #define GLOBAL extern #定义INIT(x,y) #万一 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”
因此,您将获得一个标头文件,该标头文件声明了需要它们的全局实例和函数原型的实例,以及相应的extern声明。
那么,您最喜欢的C编程技巧是什么?
BUILD_BUG_ON
宏,使用#error
inside和#if
怎么了?