Ich möchte, dass meine Funktion überall inline wird, nicht nur in einer Übersetzungseinheit (oder einer Kompiliereinheit, einer [.c] -Datei).
Mit Inline bitten Sie Ihren Compiler höflich, Ihre Funktion einzubinden (wenn es Zeit und Stimmung hat). Es hat nichts mit einer Kompilierungseinheit zu tun, im besten Fall kann es sogar in jeder einzelnen Call-Site inline sein und es wird nirgends eine Stelle haben (und sein Code wird überall dupliziert). Es ist Zweck der Inline, Geschwindigkeit zugunsten der Größe.
Ich möchte die Adresse der Funktion konsistent sein. Wenn ich die Adresse der Funktion in einem Funktionszeiger speichere, möchte ich, dass die Funktion vom Zeiger aufgerufen werden kann, und ich möchte nicht, dass die gleiche Funktion in einer anderen Übersetzungseinheit dupliziert wird. (Grundsätzlich meine ich keine 'statische Inline')
Wieder können Sie nicht. Wenn die Funktion inline ist, gibt es keinen Funktionszeiger darauf. Natürlich wird der Compiler eine Kompilierungseinheit brauchen, wo die Funktion bleibt (weil, ja, Sie brauchen vielleicht einen Funktionszeiger oder manchmal entschließt er sich, diese Funktion nicht in einer bestimmten Call-Site einzubinden).
Aus Ihrer Beschreibung geht hervor, dass static inline
gut ist. IMO ist es nicht, ein Funktionskörper (wenn verwendet, siehe oben) in jeder Kompilierungseinheit führt zur Codevervielfältigung (und zum Problem im Vergleich von Funktionszeigern, weil jede Kompilierungseinheit ihre eigene Version von Ihrer hat) Funktion). Es ist hier, dass C99 etwas ziemlich Gutes getan hat: Sie deklarieren genau einen Platz, um den Funktionskörper zu platzieren (wenn und falls erforderlich). Compiler wird es nicht für Sie tun (wenn Sie sich jemals darum kümmern) und es gibt nichts mehr zu implementieren.
Was ist die Idee hinter Inline in C99?
Wählen Sie eine gute Sache (Inline-Funktionen), aber entfernen Sie Mehrdeutigkeit (jeder C ++ - Compiler hat seinen eigenen Job gemacht, wo der Funktionskörper bleiben muss).
Welche Vorteile hat dieses Design gegenüber C ++?
Ehrlich gesagt kann ich solch ein großes Problem nicht sehen (sogar Artikel, den Sie verlinkt haben, sind ziemlich vage über diesen Vorteil ). In einem modernen Compiler werden Sie kein Problem sehen und Sie werden sich nie darum kümmern. Warum ist es gut, was C getan hat? IMO, weil es eine Mehrdeutigkeit beseitigt hat, auch wenn - offen gesagt - ich bevorzuge, dass mein Compiler das für mich tut, wenn es mir egal ist (99,999%, nehme ich an).
Das heißt, aber ich kann falsch liegen, C und C ++ haben unterschiedliche Ziele. Wenn Sie C (nicht C ++ ohne Klassen und einige C ++ - Funktionen) verwenden, dann möchten Sie wahrscheinlich diese Art von Details behandeln, weil sie in Ihrem Kontext wichtig sind, so dass C und C ++ darüber auseinander gehen mussten. Es gibt kein besseres Design: nur eine andere Entscheidung für ein anderes Publikum.