2017-03-31 2 views
0

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?

+0

Geben Sie Ihrem Enum einen Namen? –

+0

Bearbeitet die enum für Klarheit. Einen Namen zu haben macht keinen Unterschied in der Warnung. – pdel

+1

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. –

Antwort

1

Wie wäre es mit Makros nur anstelle von Variablen und Aufzählungen.

//libnameConf.h 
#define LIBNAME_A 
// #define LIBNAME_B // Uncomment this line and both comment the above line while changing libs. 

Dann verwenden wir mehrere bedingte Kompilierungsanweisungen wie diese.

//libname.c 
double coef_arr_a[100] = {...}; 
double coef_arr_b[100] = {...}; 

#ifdef LIBNAME_A 
    somestruct.waveCoefs = coef_arr_a; 
    //do other coef_arr_a specific stuff 
#endif 
#ifdef LIBNAME_B 
    somestruct.waveCoefs = coef_arr_b; 
#endif 
+0

Es gibt eine Referenz auf Wikipedia. Wir können das Thema "C Präprozessor" durchsuchen. Wie diese Seite sagt, können wir komplexere bedingte Kompilierungsanweisungen verwenden, um unsere Anforderung zu erfüllen. Verwenden von #ifdef xxx ... # elif definiert xxx ... #endif – 0x2333

0

Klingt wie Sie conditional compilaiton in C brauchen, aber die Art und Weise Sie es tun, ist nicht korrekt. Bedingte Kompilierung ist ein Konzept des preprocessor, das vor dem Compiler ausgeführt wird. Der Punkt des Präprozessors besteht darin, den Quellcode zu manipulieren, bevor er dem Compiler zugeführt wird. Da Sie keine Präprozessor-Bedingungen verwendet haben, wird der gesamte Quellcode unabhängig von den Bedingungen für die Kompilierungszeit an den Compiler übergeben. Sie sollten auf jeden Fall Preprozessor-Bedingungen verwenden, um Ihre Binärdatei zu reduzieren.