Supponiamo che tu stia costruendo delle librerie, C o C ++ non ha importanza per questa domanda, IMO. Le funzionalità (o la loro implementazione) dipendono dalle funzionalità del sistema di destinazione.
Un esempio semplice, probabilmente forzato: alcune funzionalità dipendono dal fatto che il sistema abbia o meno un% di lavoroint64_t
(tipo intero a 64 bit) o meno.
Supponendo uno stile GNU ./configure
, si finirebbe con un config.h
con contenuti come:
// ...
#define HAVE_INT64_T 1
// ...
Si potrebbe quindi includere questo config.h
(probabilmente con un nome migliore) nell'intestazione della libreria pubblica library.h
, e lasciare che le caratteristiche dipendano da HAVE_INT64_T
:
// ...
#include "config.h"
// ...
#ifdef HAVE_INT64_T
#define AWESOME_FEATURE(x) ((int64_t)(x) + 1)
extern int64_t const stupid_value;
#endif
// ...
Ora, se stai creando un'applicazione su questa libreria e i tuoi requisiti su #define HAVE_INT64_T 1
sono diversi, ad es. più severo di quelli della libreria , quando si fa nei guai:
// ...
#include "app-config.h" // does NOT define HAVE_INT64_T
#include <library.h> // defines HAVE_INT64_T
// -> stuff breaks
Quindi: È considerata una cattiva pratica mettere "configurazione" #define
s nelle intestazioni delle librerie pubbliche? E se sì, quali sono le alternative?