Forum: Compiler & IDEs C/GCC: Kompilieren fehlschlagen lassen, wenn Funktion genutzt


von Walter T. (nicolas)


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.

von Amateur (Gast)


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.

von Clemens L. (c_l)


Lesenswert?

Dieser Fehler kommt erst beim Linken:
1
#ifndef __AVR_ATmega644__
2
    extern void foo_can_only_be_used_on_ATmega644(void);
3
    foo_can_only_be_used_on_ATmega644();
4
#endif

: Bearbeitet durch User
von rmu (Gast)


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.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.