2016-04-10 16 views
3

In Bezug auf using const function parameters Ich habe gehört, dass auf einigen OS X-Systemen die Konsistenz eines Parameters in die Funktionssignatur gemangelt wird. Zum Beispiel würde, wenn man die folgende Erklärung in einer Interface-Header-Datei:Ist Funktionsparameterkonstanz nicht kompatibel?

int f(int argument); 

aber wenn man nur diese Funktion implementieren würde:

int f(int const argument); 

dann könnte dies zu einer Verknüpfung Ausfällen auf OS X führen (aber nicht unter Linux), weil die OS X-Methode, C++ - Funktionssignaturen zu zerlegen, die Konsistenz der Parameter enthält.

Welches ist das korrekte Mangling-Verhalten? Hat der C++ - Standard ein Mitspracherecht?

+0

_'int f (int const Argument); '_ ist ziemlich überflüssig, aber gut, wenn Sie darauf bestehen, dass es sinnvoll ist. –

+3

Aus Interesse, wo hast du das gehört? Das wäre sehr kaputt, wenn es stimmt. –

+0

Das korrekte Verhalten besteht darin, die oberste Ebene "const" zu ignorieren, was "const" bedeutet, was für den Parameter selbst gilt (im Gegensatz zu etwas, auf das sich der Parameter bezieht). Zum Beispiel sind "int * const" und "int *" gleich, aber "int const *" und "int *" sind unterschiedlich. Kaum zu glauben, dass OS X einen Compiler haben würde, der das falsch interpretiert (es ist ein wirklich grundlegender Teil von C++, der schon lange vor OS X bekannt war). –

Antwort

3

Die Const- und Volatile-Qualifikationsmerkmale der obersten Ebene sollten für die Namensfehlernummerierung ignoriert werden. Dies kann aus zwei Dingen im Standard ermittelt werden. Die erste besteht darin, dass die Signatur einer Funktion für die Namensänderung verwendet wird.

In der Standard-C++ 14, Abschnitt 1.3.17 definiert eine Signatur:

namen, Parameterart Liste (8.3.5) und umschließenden Namensraum (falls vorhanden) [Hinweis: Signaturen werden als Grundlage für das Mangeln und Verknüpfen von Namen verwendet. - Endnote]

die Definition einer Parameter-Typenliste zu erhalten, wir dann in Abschnitt 8.3.5/5 beziehen:

Der Typ einer Funktion der folgenden Regeln bestimmt wird, verwendet wird. Der Typ jedes Parameters (einschließlich Funktionsparameter-Packs) wird aus seinem eigenen Deklarationsspezifikator-seq und Deklarator bestimmt. Nach Bestimmen des Typs jedes Parameters ist jeder Parameter des Typs "Array von T" oder "Funktion, die T zurückgibt" , eingestellt als "Zeiger auf T" oder "Zeiger auf Funktion, die T zurückgibt". Nach dem Erzeugen der Liste der Parametertypen werden alle übergeordneten CV-Qualifier, die einen Parametertyp modifizieren, gelöscht, wenn der Funktionstyp gebildet wird. Die resultierende Liste der transformierten Parametertypen und das Vorhandensein oder Fehlen der Ellipse oder eines Funktionsparameterpakets ist die Parametertypliste der Funktion. [Hinweis: Diese Transformation wirkt sich nicht auf die Typen der Parameter aus . Zum Beispiel sind int () (const int p, decltype (p)) und int () (int, const int) identische Typen. - Endnote]

Verwandte Themen