Par exemple, je suis récemment tombé sur ceci dans le noyau Linux:
/ * Forcer une erreur de compilation si la condition est vraie * / #define BUILD_BUG_ON (condition) ((void) sizeof (char [1 - 2 * !! (condition)]))
Donc, dans votre code, si vous avez une structure qui doit être, disons un multiple de 8 octets, peut-être à cause de certaines contraintes matérielles, vous pouvez faire:
BUILD_BUG_ON ((sizeof (struct mystruct)% 8)! = 0);
et il ne se compilera que si la taille de struct mystruct est un multiple de 8, et s'il s'agit d'un multiple de 8, aucun code d'exécution n'est généré du tout.
Une autre astuce que je connais vient du livre "Graphics Gems" qui permet à un seul fichier d'en-tête à la fois de déclarer et d'initialiser des variables dans un module tandis que dans d'autres modules utilisant ce module, il suffit de les déclarer comme externes.
#ifdef DEFINE_MYHEADER_GLOBALS #define GLOBAL #define INIT (x, y) (x) = (y) #autre #define GLOBAL extern #define INIT (x, y) #fin si GLOBAL int INIT (x, 0); GLOBAL int somefunc (int a, int b);
Avec cela, le code qui définit x et somefunc fait:
#define DEFINE_MYHEADER_GLOBALS #include "the_above_header_file.h"
tandis que le code qui utilise simplement x et somefunc () fait:
#include "the_above_header_file.h"
Vous obtenez donc un fichier d'en-tête qui déclare à la fois les instances de globals et les prototypes de fonction là où ils sont nécessaires, ainsi que les déclarations externes correspondantes.
Alors, quelles sont vos astuces de programmation C préférées dans ce sens?
BUILD_BUG_ON
macro, quel est le problème avec l'utilisation de l' #error
intérieur et #if
?