Warum behält GCC leere Funktionen?

In den meisten Fällen, wenn ich ein optionales Feature in C erstellen möchte, erstelle ich einfach zwei Funktionen wie diese:

<code>#ifdef OPTIONAL_SOMETHING
void do_something(int n, const char *s)
{
    while (n--) {
        printf("%s", s);
    }

    /* ...You might get the point, really do something... */
}
#else
void do_something(int n, const char *s)
{
    /* Empty body */
}
#endif
</code>

Wenn also das Symbol undefiniert ist - wenn die Funktion deaktiviert ist - wird eine leere Funktion in die ausführbare Datei kompiliert.

Ein Blick in das Baugruppenverzeichnis lässt vermuten, dass GCCkompiliert und ruft auf die leeren funktionen wenn dieOptimierungen sind deaktiviert. Wenn dasOptimierungen sind aktiviert, auch mit-O2 und-O3eskompiliert nur den erforderlichen Stapelbehandlungscode, optimiert jedoch die Aufrufanweisungen. Alles in allem bleibt die Funktion erhalten.

Ungefähr das Gleiche gilt für die nicht leeren, aber nicht verwendeten Methoden.

Es sollte einfach die ganze Sache rausschmeißen, tut es aber nicht. Warum ist es das Standardverhalten? Und nur aus Neugier: Wie kann ich das beseitigen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage