Ad esempio, di recente mi sono imbattuto in questo nel kernel di Linux:
/ * Forza un errore di compilazione se la condizione è vera * / #define BUILD_BUG_ON (condition) ((void) sizeof (char [1 - 2 * !! (condition)]))
Quindi, nel tuo codice, se hai una struttura che deve essere, diciamo un multiplo di 8 byte di dimensione, forse a causa di alcuni vincoli hardware, puoi fare:
BUILD_BUG_ON ((sizeof (struct mystruct)% 8)! = 0);
e non verrà compilato a meno che la dimensione di struct mystruct non sia un multiplo di 8 e se si tratta di un multiplo di 8, non viene generato alcun codice di runtime.
Un altro trucco che conosco è dal libro "Graphics Gems" che consente a un singolo file di intestazione di dichiarare e inizializzare le variabili in un modulo mentre in altri moduli che usano quel modulo, semplicemente dichiararle come esterne.
#ifdef DEFINE_MYHEADER_GLOBALS #define GLOBAL #define INIT (x, y) (x) = (y) #altro #define GLOBAL extern #define INIT (x, y) #finisci se GLOBAL int INIT (x, 0); GLOBAL int somefunc (int a, int b);
Con ciò, il codice che definisce x e somefunc fa:
#define DEFINE_MYHEADER_GLOBALS #include "the_above_header_file.h"
mentre il codice che utilizza semplicemente x e somefunc () fa:
#include "the_above_header_file.h"
In questo modo si ottiene un file di intestazione che dichiara sia le istanze dei globuli che i prototipi delle funzioni dove sono necessari e le corrispondenti dichiarazioni esterne.
Quindi, quali sono i tuoi trucchi di programmazione C preferiti in questo senso?
BUILD_BUG_ONmacro, cosa c'è di sbagliato nell'uso di #errorinside e #if?