In der Embedded C-Welt speichern wir häufig Konfigurationsdetails in Headern, sodass eine Bibliothek für eine bestimmte Aufgabe erstellt werden kann, wodurch der Overhead und die kompilierte Größe minimiert werden.Kompilierzeitkonfiguration mit if-Anweisungen
Ein Beispiel wäre:
//libnameConf.h
#define LIBNAME_WAVE LIBNAME_A
typedef enum {
LIBNAME_A,
LIBNAME_B,
LIBNAME_C
} libname_wave_t;
//libname.c
double coef_arr_a[100] = {...};
double coef_arr_b[100] = {...};
double coef_arr_c[100] = {...};
if (LIBNAME_WAVE == LIBNAME_A) {
somestruct.waveCoefs = coef_arr_a;
//do other coef_arr_a specific stuff
} else if (LIBNAME_WAVE == LIBNAME_B) {...}
Für diesen speziellen Fall, dass wir eine if-Anweisung verwenden, dass der Compiler offensichtlich kollabieren, was eine gute Sache ist, weil wir nur wollen Verweis auf coef_arr_a, damit die anderen nicht in die Binärdatei kompiliert werden und Speicherplatz belegen.
Leider ergibt sich die Warnung
warning: comparison between 'enum <anonymous>' and 'enum <anonymous>' [-Wenum-compare]
Gibt es eine bessere Art und Weise, dass diese Warnung vermeidet?
Geben Sie Ihrem Enum einen Namen? –
Bearbeitet die enum für Klarheit. Einen Namen zu haben macht keinen Unterschied in der Warnung. – pdel
Ich bin nicht wirklich jemand, der die Verwendung des Präprozessors oder der Makros empfiehlt, aber für solche Dinge ist es am häufigsten und wird sicher zur Kompilierungszeit ausgewertet werden. Ihre 'if'-Anweisungen sind * nicht * erforderlich, um vom Compiler ausgewertet oder optimiert zu werden, obwohl ein guter Compiler das wahrscheinlich tut. Insbesondere ist es nicht erforderlich, dass der Compiler den Code für die nicht genommenen Zweige tatsächlich weglassen muss. Es könnte das immer noch tun, obwohl es nur darüber springt. –