Hallo zusammen,
kann man irgendwie den build bedingt fehlschlagen lassen, wenn eine
Funktion darin benötigt wird?
Dieser build schlägt immer fehl, egal, ob die Funktion foo() überhaupt
im Projekt genutzt wird:
1 | // Funktion kann nur in Projekten für den ATmega644 genutzt werden
|
2 | void foo(void)
|
3 | {
|
4 | #ifndef (__AVR_ATmega644__)
|
5 | #error "foo() can only be used on ATmega644"
|
6 | #endif
|
7 |
|
8 | ...
|
9 | }
|
10 |
|
11 | // Kann immer genutzt werden
|
12 | void bar(void)
|
13 | {
|
14 | ...
|
15 | }
|
Hier ergibt sich erst ein Laufzeitfehler, wenn die Funktion
fälschlicherweise aufgerufen wird. Unter Umständen werde ich erst sehr,
sehr spät auf den Fehler aufmerksam gemacht:
1 | // Funktion kann nur in Projekten für den ATmega644 genutzt werden
|
2 | void foo(void)
|
3 | {
|
4 | #ifndef (__AVR_ATmega644__)
|
5 | error("foo() can only be used on ATmega644");
|
6 | #endif
|
7 |
|
8 | ...
|
9 | }
|
10 |
|
11 | ...
|
Hier ist die Fehlermeldung kryptisch, wenn das Symbol nicht definiert
ist:
1 | // Funktion kann nur in Projekten für den ATmega644 genutzt werden
|
2 | void foo(void)
|
3 | {
|
4 | static_assert(__AVR_ATmega644__&=0),"foo() can only be used on ATmega644");
|
5 |
|
6 | ...
|
7 | }
|
8 |
|
9 | ...
|
Hier fängt die Suche an, warum die Funktion nicht definiert ist. Ich
habe immer eine nervige Warnung, auch wenn es noch kein Problem gibt:
1 | // Funktion kann nur in Projekten für den ATmega644 genutzt werden
|
2 | #ifdef (__AVR_ATmega644__)
|
3 | void foo(void)
|
4 | {
|
5 | ...
|
6 | }
|
7 | #else
|
8 | #warning "foo() can only be used on ATmega644"
|
9 | #endif
|
10 |
|
11 | ...
|
Deshalb die Frage: Wie kann ich sinnvoll sicherstellen, daß ich eine
vernünftige Fehlermeldung erscheint, wenn ich in einem build eine
Funktion aufrufen will, die für diesen Kontext (MCU, Build-Parameter
etc.) gar nicht gedacht ist?
Viele Grüße
W.T.