Por exemplo, recentemente deparei com isso no kernel do linux:
/ * Força um erro de compilação se a condição for verdadeira * / #define BUILD_BUG_ON (condição) ((nulo) sizeof (char [1 - 2 * !! (condição)]))
Portanto, no seu código, se você tem alguma estrutura que deve ser, digamos um múltiplo de 8 bytes de tamanho, talvez por causa de algumas restrições de hardware, você pode:
BUILD_BUG_ON ((tamanho da estrutura)% 8)! = 0);
e não será compilado, a menos que o tamanho da estrutura mystruct seja múltiplo de 8 e, se for múltiplo de 8, nenhum código de tempo de execução será gerado.
Outro truque que conheço é do livro "Graphics Gems", que permite que um único arquivo de cabeçalho declare e inicialize variáveis em um módulo enquanto em outros módulos usando esse módulo, apenas as declara como externas.
#ifdef DEFINE_MYHEADER_GLOBALS #define GLOBAL #define INIT (x, y) (x) = (y) #outro #define GLOBAL extern #define INIT (x, y) #fim se GLOBAL int INIT (x, 0); GLOBAL int de alguma forma (int a, int b);
Com isso, o código que define x e somefunc faz:
#define DEFINE_MYHEADER_GLOBALS #include "the_above_header_file.h"
enquanto o código que está apenas usando x e somefunc () faz:
#include "the_above_header_file.h"
Portanto, você obtém um arquivo de cabeçalho que declara as instâncias de protótipos globais e de função onde elas são necessárias e as declarações externas correspondentes.
Então, quais são seus truques favoritos de programação C nesse sentido?
BUILD_BUG_ON
macro, o que há de errado em usar #error
inside e #if
?