Betrachten Sie den folgenden Code ein:Kann eine Inline-Funktion in einer Header-Datei eine Konstante verwenden, die intern verknüpft ist?
const int a = 0;
const std::string b = "hi";
inline void f_a1()
{
std::cout << a;
}
inline void f_b1()
{
std::cout << b;
}
inline void f_a2()
{
std::cout << &a;
}
inline void f_b2()
{
std::cout << &b;
}
Angenommen, dieser Code in einer Header-Datei vorhanden ist, die in mehreren Übersetzungseinheiten aufgenommen werden.
Mein Verständnis von Inline-Funktionen ist, dass sie in jeder Übersetzungseinheit genau gleich sein müssen.
Mein Verständnis von Konstanten, wie oben verwendet, ist, dass sie implizit sind static
dh interne Verknüpfung. Dies bedeutet, dass jede Übersetzungseinheit ihre eigene Kopie erhält.
Da die obigen Inline-Funktionen auf diesen Konstanten beruhen, welche dieser Funktionen sind, wenn überhaupt, korrekt?
'f_a1' und' f_b1' sind korrekt, da sie sich auf den Wert einer Konstanten beziehen. Selbst wenn der Compiler mehr als eine Konstante erstellt, haben sie alle den gleichen Wert. Selbst wenn unterschiedliche Vorkommen der Funktionen unterschiedliche tatsächliche Konstanten verwenden, wird es die Erwartungen für den Code nicht brechen (übrigens wird der meiste Compiler die Konstante "int" direkt in dem erzeugten Code falten, so dass es kein tatsächliches "a" gibt Konstante in Ihrem Programm). Ich denke an die anderen beiden. –
@GiulioFranco Warum wäre 'f_a2' pr' f_b2' falsch? –
@LuchianGrigore Ich habe nicht gesagt, dass sie es sind. Ich denke darüber nach.Wenn die Konstanten wirklich statisch verknüpft sind (worüber ich nicht sicher bin), dann könnte der Compiler unterschiedliche Instanzen von ihnen haben, die unterschiedliche Adressen haben, wenn der Linker nicht in der Lage ist, die verschiedenen Definitionen zu vereinheitlichen (was der Fall sein sollte)). –