Was sagt der C++ Standard zu toupper



  • waren nicht alle Bezeichner mit _ oder __ Compilerabhänig ?



  • SeppSchrot schrieb:

    toupper ist standardkonform, _toupper nicht.

    Heisst das jetzt g++ ist der Böse, oder könnte es ein vom Standard nicht geregeltes Implementationsdetail sein dass toupper nicht mit transform kompatibel ist ?
    Kurt



  • beim g++ bis 3.4 gab es bei toupper irgend ein Problem. Ich glaub das war als Macro implementiert oder so etwas. Naja, nimm einfach g++ 3.4 oder 4.0 🙂



  • kingruedi schrieb:

    beim g++ bis 3.4 gab es bei toupper irgend ein Problem. Ich glaub das war als Macro implementiert oder so etwas. Naja, nimm einfach g++ 3.4 oder 4.0 🙂

    Danke. Jetzt habe ich endlich einen Grund auf 3.4 umzusteigen.
    Kurt



  • Scheinbar gibt es in den headern von g++ gar keine funktion toupper die zu transform kompatibel ist.

    Da irst du dich. transform erwartet keinen festen Typ. Der letzte Parameter ist ein Template-Parameter und wird beim Aufruf passend hergeleitet. Und hier genau ist jetzt das Problem. Im Namespace std gibt es mehr als eine toupper-Funktion. Aus diesem Grund ist:

    transform(i1.begin(),i1.end(),i1.begin(), toupper);
    

    schlicht mehrdeutig und damit kein gültiges C++.

    Die logische Alternative:

    transform(i1.begin(),i1.end(),i1.begin(), static_cast<int (*)(int)>(toupper));
    

    wiederum ist nicht portabel, da der C++ Standard keine festen Signaturen vorschreibt.

    Die standkonforme und portable Lösung ist die Variante mit mytoupper. Wenn du jetzt noch das char <-> unsigned char <-> int Problem (das ich hier jede Woche mindestens einmal erkläre) berücksichtigst, dann wird's am Ende sogar korrekt.



  • Wenn du es jede Woche min. einmal erklärst, wieso tust du es nicht dann in dein C++ FAQ auf deiner Seite? (Auch wenn ich garnicht weiß, worum es bei dem Problem geht ;))



  • gute frage 🤡 👍



  • Brutus schrieb:

    Wenn du es jede Woche min. einmal erklärst, wieso tust du es nicht dann in dein C++ FAQ auf deiner Seite? (Auch wenn ich garnicht weiß, worum es bei dem Problem geht ;))

    Weil mir schlicht kein guter Titel einfällt. Ein Titel wie "Was muss man bei der Benutzung von Character-Classification und -Conversion-Funktionen wie z.B. tolower beachten?" hört sich für den vorbeistreifenden Leser imo etwa so an: Bla Bla Bla, Langweilig, Bla Bla?



  • Schreib am Anfang

    #include <cctype>
    

    dazu. Dann gibts auch toupper.



  • HumeSikkins schrieb:

    Brutus schrieb:

    Wenn du es jede Woche min. einmal erklärst, wieso tust du es nicht dann in dein C++ FAQ auf deiner Seite? (Auch wenn ich garnicht weiß, worum es bei dem Problem geht ;))

    Weil mir schlicht kein guter Titel einfällt. ...

    Wie wär's den mit

    HumeSikkins schrieb:

    ...das char <-> unsigned char <-> int Problem...

    ? 😃
    evtl. noch "... und toupper/tolower" dahinter ...

    Gruß,

    Simon2.


Anmelden zum Antworten