例如,我最近在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和somefunc的代码可以:
#define DEFINE_MYHEADER_GLOBALS #include "the_above_header_file.h"
而仅使用x和somefunc()的代码可以:
#include "the_above_header_file.h"
所以你得到一个头文件,它声明了需要它们的全局变量和函数原型的实例,以及相应的extern声明.
那么,你最喜欢的C编程技巧是什么?
在我必须维护的一些代码中,我看到了一个格式说明符%*s.任何人都可以告诉我这是什么以及为什么使用它?
它的用法示例如下:
fprintf(outFile, "\n%*s", indent, "");
Run Code Online (Sandbox Code Playgroud)