C/GCC: Kompilieren fehlschlagen lassen, wenn Funktion genutzt

OP #4460193
Lesenswert?

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.
Gast #4460199
Lesenswert?

Das sollte mit einem Trick im Batch gehen.
Wird die Compiler-Direktive #error genutzt, gibt der Compiler einen 
abfragbaren Return-wert aus.
In den meisten Fällen wird dieser im Batch-File ignoriert und mit dem 
nächsten Compiler-Aufruf weitergemacht.
Ist toll, wenn man viele Einzeldateien zusammenführt.
Gast #4460235
Lesenswert?

Walter T. schrieb:
> Hier ist die Fehlermeldung kryptisch, wenn das Symbol nicht definiert
> ist:// Funktion kann nur in Projekten für den ATmega644 genutzt werden
> void foo(void)
> {
>     static_assert(__AVR_ATmega644__&=0),"foo() can only be used on
> ATmega644");
>
>     ...
> }

http://stackoverflow.com/questions/3385515/static-assert-in-c

Mit einem halbwegs aktuellen GCC kann man _Static_assert verwenden oder 
die betroffene Funktion mit __attribute__((error("msg"))) markieren.
(Firma: Torrox.de) #4461347
Lesenswert?

Walter T. schrieb:

> // Funktion kann nur in Projekten für den ATmega644 genutzt werden
> #ifdef (_AVR_ATmega644_)
>     void foo(void)
>     {
>         ...
>     }
> #else
>     #warning "foo() can only be used on ATmega644"
> #endif

was spräche, gegen die Lösung, die Funktion einfach nicht zu definieren? 
Das entspricht Deiner zitierten Lösung, aber ohne das #else? Es gibt 
einige Linker, die aus "undefined symbols" nur eine Warnung machen, da 
müsstest Du Dir ggf. ein script um den Linker stricken, der die Warnung 
erkennt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren