Typsicherheit char und wchar_t ???
-
Was für einen Compiler benutzt du denn?
-
Ich benutze g++ unter Ubuntu, als Warninglevel habe ich -Wall eingestellt.
Zuweisung wc = c ohne Meldung zu akzeptieren ist selbstverstaendlich OK, da dabei kein Konvertierungsverlust eintreten kann. c = wc ohne Warning ist aber tueckisch ...
-
Quatsch. Erst jetzt ist mir aufgefallen, dass ich bei dem momentanen Projekt die Option -Wall irrtuemlich NICHT eingestellt hatte. Also der gcc warnt auch bei c = wc. Mea culpa ...
-
Diogenes77 schrieb:
lso der gcc warnt auch bei c = wc. Mea culpa ...
Nö:
$ cat ch.cpp #include <iostream> int main() { wchar_t wc = L'x'; char c = wc; std::cout << c; } $ g++ -Wall -pedantic ch.cpp $
-
Diogenes77 schrieb:
Wo bleibt die vielgepriesene Typsicherheit von C++ ??
Das Problem ist die Kompatibilität mit C, diese verlangt dieses Verhalten. Andernfalls müßte man einen Konversions-Cast-Operator einführen, den man immer dann benutzen muß, wenn man Typen mit einem größeren Wertebereich in Typen mit kleineren Wertebereich konvertieren will.
Bei selbst definierten Klassen ist das übrigens kein Problem, da kann man Konversionskonstruktoren definieren, die diese Eigenschaft aufweisen. Nur wchar_t ist ein typedef und somit ein POD und erfüllt diese Bedingung nun einmal nicht - leider.
-
wchar_t ist kein typedef. Unter msvc ist er build-in, und so sollte es auch sein.
-
unicode-freak schrieb:
Artchi schrieb:
MSVC 8.0 schrieb:
warning C4244: '=' : conversion from 'wchar_t' to 'char', possible loss of data
Also bei mir kommt zumindest ein Warning.
der umgekehrte fall ist gemeint, also wenn einem wchar_t ein char zugewiesen wird, du blitzmerker.

ähhh apropos "Blitzmerker": Nein, genau der von Artchi genannte Fall ist gemeint (wenn man versucht, ein wchar in ein char zu konvertieren ....
Dass der andere Fall problemlos ist und auch zu keiner Warnung führen sollte, wurde bereits weiter oben geklärt....Hier hast Du Deine Steine zurück und die Telefonummer des Glasers....
Gruß,
Simon2.
-
typesafe-freak schrieb:
Simon2 schrieb:
ähhh apropos "Blitzmerker": Nein, genau der von Artchi genannte Fall ist gemeint (wenn man versucht, ein wchar in ein char zu konvertieren ....
ich dachte der andere. wenn man ein wchar_t einem char zuweist ist's ja wohl klar dass da ein warning kommt, weil der wchar_t beschnitten werden muss.
Es kommt ja aber im GCC 4.2 eben gerade *keine* Warnung.
-
Artchi schrieb:
wchar_t ist kein typedef. Unter msvc ist er build-in, und so sollte es auch sein.
Die ISO C Norm sagt nur, daß wchar_t in <stddef.h> als Typ definiert wird. Header müssen nicht als Dateien vorhanden sein, wenn doch dann ergibt sich zwangsweise, daß wchar_t ein typedef ist.
-
~john schrieb:
Artchi schrieb:
wchar_t ist kein typedef. Unter msvc ist er build-in, und so sollte es auch sein.
Die ISO C Norm sagt nur, daß wchar_t in <stddef.h> als Typ definiert wird.
Wir sind hier aber im C++-Forum und der Standard sagt unter diff.wchar.t, dass das in C++ eben genau *nicht* dort definiert ist.
/EDIT: 3.9.1.5 spezifiziert nochmal explizit, dass 'wchar_t' ein „distinct type“ ist – also kein typedef.
-
Konrad Rudolph schrieb:
/EDIT: 3.9.1.5 spezifiziert nochmal explizit, dass 'wchar_t' ein „distinct type“ ist – also kein typedef.
Tja, das kommt davon, wenn man in der falschen Norm nachschaut.
-
Konrad Rudolph schrieb:
...
Es kommt ja aber im GCC 4.2 eben gerade *keine* Warnung.DAS habe ich auch nicht bestritten, sondern nur, dass Artchi eine Warnung im falschen Fall erwartet habe.
Dass bei Deinem Compile keine Warnung erschien, habe ich durchaus zur Kenntnis genommen...Gruß,
Simon2.
-
@Konrad
Füge mal das Flag -Wconversion bei der Kompilierung hinzu, dann sollte auch eine Warnung kommen.