Zum Beispiel bin ich kürzlich im Linux-Kernel darauf gestoßen:
/ * Erzwinge einen Kompilierungsfehler, wenn die Bedingung erfüllt ist * / #define BUILD_BUG_ON (Bedingung) ((void) sizeof (char [1 - 2 * !! (Bedingung)]))
Wenn Sie also in Ihrem Code eine Struktur haben, die beispielsweise ein Vielfaches von 8 Bytes groß sein muss, möglicherweise aufgrund einiger Hardwareeinschränkungen, können Sie Folgendes tun:
BUILD_BUG_ON ((sizeof (struct mystruct)% 8)! = 0);
und es wird nicht kompiliert, es sei denn, die Größe von struct mystruct ist ein Vielfaches von 8, und wenn es ein Vielfaches von 8 ist, wird überhaupt kein Laufzeitcode generiert.
Ein weiterer Trick, den ich kenne, stammt aus dem Buch "Graphics Gems", mit dem eine einzelne Header-Datei Variablen in einem Modul deklarieren und initialisieren kann, während sie in anderen Modulen, die dieses Modul verwenden, lediglich als extern deklariert werden.
#ifdef DEFINE_MYHEADER_GLOBALS # GLOBAL definieren #define INIT (x, y) (x) = (y) #sonst #define GLOBAL extern #define INIT (x, y) #endif GLOBAL int INIT (x, 0); GLOBAL int somefunc (int a, int b);
Damit macht der Code, der x und somefunc definiert, Folgendes:
#define DEFINE_MYHEADER_GLOBALS #include "the_above_header_file.h"
während Code, der lediglich x und somefunc () verwendet, Folgendes tut:
#include "the_above_header_file.h"
Sie erhalten also eine Header-Datei, die sowohl Instanzen von Globals als auch Funktionsprototypen deklariert, wo sie benötigt werden, sowie die entsprechenden externen Deklarationen.
Also, was sind deine Lieblings-C-Programmier-Tricks in dieser Richtung?
BUILD_BUG_ONMakro, was noch falsch mit der Verwendung von #errorinnen und #if?