{"id":76,"date":"2007-05-31T20:23:58","date_gmt":"2007-05-31T18:23:58","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2007\/05\/31\/_unicode-versus-unicode-und-so-manches-eigentuemliche\/"},"modified":"2007-05-31T20:25:20","modified_gmt":"2007-05-31T18:25:20","slug":"_unicode-versus-unicode-und-so-manches-eigentuemliche","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2007\/05\/31\/_unicode-versus-unicode-und-so-manches-eigentuemliche\/","title":{"rendered":"_UNICODE versus UNICODE und so manches Eigent\u00fcmliche"},"content":{"rendered":"<p>Wann nimmt man eigentlich was?<br \/>\nJedesmal wenn ich Code ansehe finde ich mal einen<\/p>\n<p class=\"ccode\">#ifdef _UNICODE<\/p>\n<p>dann mal wieder einen<\/p>\n<p class=\"ccode\">#ifdef UNICODE<\/p>\n<p>Wann eigentlich was?<br \/>\nDie Frage wurde schon oft beantwortet (siehe <a href=\"http:\/\/blogs.msdn.com\/oldnewthing\/archive\/2004\/02\/12\/71851.aspx\">The Old New Thing : TEXT vs. _TEXT vs. _T, and UNICODE vs. _UNICODE<\/a>).<\/p>\n<p>In Kurzform:<br \/>\n<em>UNICODE<\/em> wird in den Windows Header-Dateien verwendet.<br \/>\n<em>_UNICODE <\/em>in der C-Runtime (CRT).<\/p>\n<p>Interessanterweise gibt es nur den Define <em>_MBCS <\/em>aber nicht den Define <em>MBCS<\/em>. Anhand der Namensgebung kann man sehen, dass <em>_MBCS <\/em>aus\/f\u00fcr die CRT nur Einfluss hat. Die Windows API sagt einfach, wenn nicht Unicode dann ist es <em>MBCS<\/em>!<\/p>\n<p>Daraus ergeben sich einige interessante Abh\u00e4ngigkeiten:\u00a0<\/p>\n<p><em>_T <\/em>ist abh\u00e4ngig vom Define <em>_UNICODE <\/em>genauso wie <em>_TEXT <\/em>(also der CRT)<br \/>\n<em>TEXT <\/em>ist wiederum abh\u00e4ngig vom Define <em>UNICODE<\/em>.<\/p>\n<p>Jetzt wird es aber ganz lustig:<br \/>\nDie Datei <em>tchar.h <\/em>geh\u00f6rt zur CRT. Und <em>TCHAR <\/em>ist eigentlich kein Define aus tchar.h und der CRT. Dort wird n\u00e4mlich eigentlich _<em>TCHAR <\/em>definiert und sollte <em>TCHAR <\/em>schon definiert sein (durch die windows.h), dann wird <em>TCHAR <\/em>nicht mehr umdefiniert.<\/p>\n<p>Ist also nur <em>UNICODE <\/em>definiert und nicht <em>_UNICODE<\/em>, dann muss der folgende Code einen Compiler Fehler ausl\u00f6sen, wenn windows.h vor der tchar.h inkludiert wird. Erwartungsgem\u00e4\u00df meldet der folgende Code einen Compiler-Fehler, obwohl dieser perfekt und korrekt aussieht:<\/p>\n<p class=\"ccode\">#include &lt;windows.h&gt;<br \/>\n#include &lt;stdio.h&gt;<br \/>\n#include &lt;tchar.h&gt;<br \/>\nint _tmain(int argc, _TCHAR* argv[])<br \/>\n{<br \/>\n\u00a0const TCHAR szText[] = &#8222;&#8220;;<br \/>\n\u00a0 \/\/ Must fail if UNICODE is defined and not _UNICODE, and windows.h included first<br \/>\n\u00a0_tcslen(szText);<br \/>\n\u00a0return 0;<br \/>\n}<\/p>\n<p>In VC6 gab es noch keine Projekteinstellung f\u00fcr Unicode. Man musste also beide Defines setzen, als Pr\u00e4prozessor Definition. Andernfalls hatte man eine lustige Code Mischung und lief schnell mal in ein Problem wie oben.<\/p>\n<p>Der Schalter in <em>VC-2005 <\/em>und <em>VC-2003<\/em> f\u00fcr<\/p>\n<ul>\n<li>&#8222;Use Unicode Character Set&#8220; setzt beide Defines <em>_UNICODE <\/em>und <em>UNICODE<\/em><\/li>\n<li>&#8222;Use Multi-Byte Character Set&#8220; setzt nur <em>_MBCS<\/em>.<\/li>\n<li>&#8222;Not set&#8220; setzt Erwartungsgem\u00e4\u00df keinen der Defines und man kann das obige Beispiel und den Fehler ausprobieren.<\/li>\n<\/ul>\n<p>Projektintern verwende ich grunds\u00e4tzlich immer intern nur den define <em>UNICODE <\/em>um zu pr\u00fcfen welche Art von Projekt hier l\u00e4uft. Und ich achte darauf, dass die windows.h bzw. die afxwin.h Datei immer als erstes inkludiert werden. Dann ist <em>TCHAR <\/em>entsprechend konform f\u00fcr die Windows API gesetzt. Die CRT ist f\u00fcr mich meistens nur Beiwerk und ich vermeide Ihre Verwendung eigentlich wo ich kann.<\/p>\n<p>An kritischen Stellen baue ich auch gerne den folgenden Test ein um ganz auf Nummer sicher zu gehen:<\/p>\n<p class=\"ccode\">#if defined(UNICODE) ^ defined(_UNICODE)<br \/>\n#error Inconsitent UNICODE and _UNICODE definition<br \/>\n#endif<\/p>\n<p>Mit dem XOR-Operator wird hier ein Fehler ausgel\u00f6st wenn nur einer der beiden Defines gesetzt ist.<\/p>\n<p>Siehe auch die MSDN <a href=\"http:\/\/support.microsoft.com\/kb\/99359\/en-us\">INFO: UNICODE and _UNICODE Needed to Compile for Unicode<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wann nimmt man eigentlich was? Jedesmal wenn ich Code ansehe finde ich mal einen #ifdef _UNICODE dann mal wieder einen #ifdef UNICODE Wann eigentlich was? Die Frage wurde schon oft beantwortet (siehe The Old New Thing : TEXT vs. _TEXT vs. _T, and UNICODE vs. _UNICODE). In Kurzform: UNICODE wird in den Windows Header-Dateien verwendet. &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2007\/05\/31\/_unicode-versus-unicode-und-so-manches-eigentuemliche\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201e_UNICODE versus UNICODE und so manches Eigent\u00fcmliche\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[19,3,2],"tags":[370,61],"class_list":["post-76","post","type-post","status-publish","format-standard","hentry","category-crt","category-programmieren","category-windows-api","tag-c","tag-winapi"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/76","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=76"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/76\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=76"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=76"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=76"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}