Por ejemplo, recientemente me encontré con esto en el kernel de Linux:
/ * Forzar un error de compilación si la condición es verdadera * / #define BUILD_BUG_ON (condición) ((nulo) sizeof (char [1 - 2 * !! (condición)]))
Entonces, en su código, si tiene alguna estructura que debe ser, digamos un múltiplo de 8 bytes de tamaño, tal vez debido a algunas restricciones de hardware, puede hacer:
BUILD_BUG_ON ((sizeof (struct mystruct)% 8)! = 0);
y no se compilará a menos que el tamaño de struct mystruct sea un múltiplo de 8, y si es un múltiplo de 8, no se generará ningún código de tiempo de ejecución.
Otro truco que conozco es del libro "Graphics Gems", que permite que un solo archivo de encabezado declare e inicialice variables en un módulo mientras que en otros módulos que usan ese módulo, simplemente los declara como externos.
#ifdef DEFINE_MYHEADER_GLOBALS #define GLOBAL #definir INIT (x, y) (x) = (y) #más #definir GLOBAL externo #definir INIT (x, y) #terminara si GLOBAL int INIT (x, 0); GLOBAL int somefunc (int a, int b);
Con eso, el código que define xy somefunc hace:
#define DEFINE_MYHEADER_GLOBALS #include "the_above_header_file.h"
mientras que el código que simplemente usa xy somefunc () hace:
#include "the_above_header_file.h"
Por lo tanto, obtiene un archivo de encabezado que declara ambas instancias de prototipos globales y de función donde se necesitan, y las correspondientes declaraciones externas.
Entonces, ¿cuáles son tus trucos de programación C favoritos en ese sentido?
BUILD_BUG_ONmacro, ¿qué tiene de malo usar #errordentro y #if?