Наприклад, я нещодавно натрапив на це в ядрі Linux:
/ * Примушуйте помилку компіляції, якщо умова істинна * / #define BUILD_BUG_ON (умова) ((недійсний)) розмір (char [1 - 2 * !! (умова)]))
Отже, у своєму коді, якщо у вас є якась структура, яка повинна бути, скажімо, кратне 8 байт, можливо, через деякі апаратні обмеження, ви можете зробити:
BUILD_BUG_ON ((sizeof (struct mystruct)% 8)! = 0);
і він не буде компілюватися, якщо розмір структури mystruct не є кратним 8, а якщо він кратний 8, взагалі не створюється код виконання.
Ще одна хитрість, яку я знаю, - це книга "Графічні дорогоцінні камені", яка дозволяє одному файлу заголовка оголошувати і ініціалізувати змінні в одному модулі, а в інших модулях, що використовують цей модуль, просто оголошувати їх як екстернали.
#ifdef DEFINE_MYHEADER_GLOBALS #define GLOBAL #define INIT (x, y) (x) = (y) #else #define GLOBAL екстерн #define INIT (x, y) #endif GLOBAL int INIT (x, 0); GLOBAL int somefunc (int a, int b);
З цим код, який визначає x та somefunc:
#define DEFINE_MYHEADER_GLOBALS #include "the_above_header_file.h"
в той час як код, який використовує лише x та somefunc (), робить:
#include "the_above_header_file.h"
Таким чином, ви отримуєте один заголовок, який оголошує як екземпляри глобалів, так і прототипи функцій там, де вони потрібні, та відповідні зовнішні декларації.
Отже, які ваші улюблені трюки з програмування на C?
BUILD_BUG_ONмакросу, що не так із використанням #errorвсередині та #if?