Örneğin, son zamanlarda linux çekirdeğinde bununla karşılaştım:
/ * Koşul doğruysa bir derleme hatasını zorla * / #define BUILD_BUG_ON (koşul) ((geçersiz) sizeof (karakter [1 - 2 * !! (koşul)]))
Bu nedenle, kodunuzda, belki de bazı donanım kısıtlamaları nedeniyle, 8 baytın katlarından biri olması gereken bir yapıya sahipseniz, şunları yapabilirsiniz:
BUILD_BUG_ON ((sizeof (yapı gizemi)% 8)! = 0);
ve struct mystruct boyutu 8'in katı değilse ve 8'in katı ise hiçbir çalışma zamanı kodu üretilmezse derlenmez.
Bildiğim başka bir numara, tek bir başlık dosyasının bir modüldeki değişkenleri hem modül olarak tanımlamasına hem de başlatmasına izin veren "Grafik Taşları" kitabından kaynaklanıyor.
#ifdef DEFINE_MYHEADER_GLOBALS #define KÜRESEL #define INIT (x, y) (x) = (y) #Başka #define GLOBAL extern #define INIT (x, y) #endif GLOBAL int INIT (x, 0); GLOBAL int somefunc (int a, int b);
Bununla birlikte, x ve somefunc'u tanımlayan kod şunları yapar:
#define DEFINE_MYHEADER_GLOBALS #include "the_above_header_file.h"
yalnızca x ve somefunc () kullanan kodlar:
#include "the_above_header_file.h"
Böylece, hem globallerin hem de ihtiyaç duydukları yerde işlev prototiplerinin ve karşılık gelen extern bildirimlerinin bildirildiği bir başlık dosyası alırsınız.
Peki, bu hatlar boyunca en sevdiğiniz C programlama hileleri nelerdir?
BUILD_BUG_ON
kullanarak makro, bilmem ne yanlış #error
içini ve #if
?