Was bedeutet "::" in ":: tolower"?

8

Ich habe Code wie folgt gesehen:

%Vor%

Und ich habe eine Frage: Was bedeutet :: vor tolower?

und std::tolower funktioniert nicht, aber ::tolower funktioniert OK

    
VextoR 11.03.2011, 08:49
quelle

4 Antworten

7

Bedeutet, dass es das tolower explizit im globalen Namespace verwendet (was vermutlich die stdc-lib ist).

Beispiel:

%Vor%     
EboMike 11.03.2011, 08:53
quelle
8

Warum :: notwendig ist: Der Standard definiert zwei tolower , eine Funktionsvorlage in std:: und eine einfache Funktion in :: und %Code%. Abhängig davon, welche Header enthalten sind (und das beinhaltet Header, die indirekt von anderen Headern enthalten sind, die Sie möglicherweise nicht kennen etwa), entweder der eine oder der andere oder beide können sichtbar sein. Die Verwendung von std:: stellt sicher dass der ältere, vom C-Standard, verwendet wird. (Wenn der in :: wird betrachtet, der Aufruf wird mehrdeutig sein, da die Transformation eine Vorlage ist selbst, und der Compiler kann die Vorlage nicht ableiten Argumente.)

Wenn ich schon dabei bin, könnte ich erwähnen, dass std:: so ist undefiniertes Verhalten, zumindest wenn das einfache Zeichen signiert ist. Die Eingabe zu ::tolower ist ein int und muss im Bereich ::tolower ... 0 oder UCHAR_MAX liegen. Ob Plain Char ist signiert, einige der Zeichen können negativ sein Codierungen, die zu undefiniertem Verhalten führen. In der Praxis die meisten Implementierungen machen das funktioniert. Für alle Charaktere außer EOF (ÿ in Latein 1). Wenn Sie sich nicht mit Portabilität befassen, haben einige Compiler ein Schalter, um Char ohne Vorzeichen zu machen --- benutze es. Ansonsten schreibe einen kleinen Funktionsobjekt, um es richtig zu behandeln, entweder:

%Vor%

oder (besser, aber wesentlich mehr Arbeit --- nur wert, wenn Sie es benutzen viel), ein funktionales Objekt, dessen Konstruktor ein Gebietsschema (defaulting zum globalen Gebietsschema) und enthält einen Verweis auf ein 0xFF , das Es wird für die Funktion std::ctype verwendet. (Natürlich, wenn du wirklich bist internationalisiert hat tolower wahrscheinlich keine Bedeutung. Und Sie werden UTF-8 verwenden, eine Multi-Byte-Codierung, und funktioniert nicht mit einer der verfügbaren Möglichkeiten.)

    
James Kanze 11.03.2011 09:11
quelle
4

Verwenden Sie die Version aus dem globalen Namespace. (Wahrscheinlich <ctypes.h> und nicht <cctypes> wenn std:: nicht funktioniert)

    
AProgrammer 11.03.2011 08:52
quelle
0

:: ist der globale Namensraum.

%Vor%     
jhasse 11.03.2011 08:57
quelle

Tags und Links