Na przykład niedawno natknąłem się na to w jądrze Linuksa:
/ * Wymuś błąd kompilacji, jeśli warunek jest prawdziwy * / # zdefiniować BUILD_BUG_ON (warunek) ((void) sizeof (char [1 - 2 * !! (warunek)]))
Tak więc w swoim kodzie, jeśli masz jakąś strukturę, która musi mieć, powiedzmy, wielokrotność 8 bajtów, być może z powodu pewnych ograniczeń sprzętowych, możesz zrobić:
BUILD_BUG_ON ((sizeof (struct mystruct)% 8)! = 0);
i nie skompiluje się, chyba że rozmiar struct mystruct jest wielokrotnością 8, a jeśli jest wielokrotnością 8, nie jest generowany żaden kod wykonawczy.
Inna sztuczka, którą znam, pochodzi z książki „Graphics Gems”, która pozwala pojedynczemu plikowi nagłówkowemu zarówno deklarować, jak i inicjować zmienne w jednym module, podczas gdy w innych modułach używających tego modułu, po prostu deklaruje je jako zewnętrzne.
#ifdef DEFINE_MYHEADER_GLOBALS #define GLOBAL # zdefiniować INIT (x, y) (x) = (y) #jeszcze #define GLOBAL extern # zdefiniować INIT (x, y) #endif GLOBAL int INIT (x, 0); GLOBAL int somefunc (int a, int b);
Dzięki temu kod, który definiuje x i somefunc, robi:
# zdefiniować DEFINE_MYHEADER_GLOBALS #include „the_above_header_file.h”
podczas gdy kod, który używa tylko x i somefunc (), robi:
#include „the_above_header_file.h”
Otrzymujesz więc jeden plik nagłówkowy, który deklaruje zarówno instancje zmiennych globalnych, jak i prototypy funkcji tam, gdzie są potrzebne, oraz odpowiadające im deklaracje extern.
Więc jakie są twoje ulubione sztuczki programowania w C w tym zakresie?
BUILD_BUG_ONmakro, co jest złego w używaniu #errorwewnątrz i #if?