ISO C++ unterstützt %z nicht - Standard für C++
-
Hallo,
ich compiliere mit GCC unter Debian Linux bzw. Kubuntu (11.10) mit 64 Bit.Beim gcc benutze ich für C-Programme den Schalter -std=C99 und kann dann
size_t len = strlen("Hello"); printf("Hello-len: %zu\n", len);schreiben. Wenn ich das ganze mit g++ mache, geht der Schalter -std=C99 nicht, aber z.B. -std=C++11. Dann bekomme ich beim Einsatz von %zu die Warnung:
ISO C++ unterstützt nicht den Längenmodifizierer »z« gnu_printf [-Wformat]Ich kann zwar die Warnung ignorieren, denn ich verstehe das so, dass g++ den Modifizierer durchaus kennt. Aber andere Compiler würden das nicht so sehen, weil es nicht zum Standard gehört.
Gibt es denn für C++ einen anderen Standard oder ist printf so bäh, dass man sich damit garnicht abgibt?
Wichtig ist der Modifizierer für Software, die sowohl für 32-Bit als auch für 64-Bit Maschinen compiliert werden muß. Zwar setze ich nicht printf ein, aber snprintf brauche ich für verschiedene Zwecke, vor allem für LOG-Messages. Ich arbeite mit einer Mischung aus C und C++.
-
Du mußt wissen, das C++ kein C99 kennt. Auch der erst kürzlich verabschiedete Standard C++11 kennt kein C99, höchstens C89. Somit ist das Verhalten völlig korrekt.
Wenn du C++ programmierst, solltest du sowieso die C++ Standard-Library oder dritte Bibliotheken nutzen. Die String-Klasse von C++ kann dir doch bereits die Länge liefern. Und die Länge in einen String umwandeln können die Standard-Streams von C++ ebenfalls. Schau dir z.B. Boost.Format an, wenn es C-like sein soll.
-
Hallo,
Artchi schrieb:
Du mußt wissen, das C++ kein C99 kennt. Auch der erst kürzlich verabschiedete Standard C++11 kennt kein C99, höchstens C89. Somit ist das Verhalten völlig korrekt.
War ich nicht deutlich genug? Das weiß ich schon...
Artchi schrieb:
Wenn du C++ programmierst, solltest du sowieso die C++ Standard-Library oder dritte Bibliotheken nutzen. Die String-Klasse von C++ kann dir doch bereits die Länge liefern. Und die Länge in einen String umwandeln können die Standard-Streams von C++ ebenfalls. Schau dir z.B. Boost.Format an, wenn es C-like sein soll.
Ich programmiere in C++ seitdem die Sprache veröffentlicht wurde. Ich habe eine spezielle Kombination aus C und C++, bei der die meisten C++-Features garnicht vorkommen, weder streams noch <string> werden benutzt. Das hat Gründe und wird nicht geändert.
Aber wenn ich Dich richtig verstehe, meinst Du, ich muß mich an diese Warnung einfach gewöhnen, oder?
-
Compiler-Warnungen soll man normalerweise beheben. Ich habe dir Alternativen genannt. Wenn du diese aus persönlichen Gründen nicht nutzen willst, mußt du damit leben und z.B. die Warning mit einem #pragma ausschalten. Oder du implementierst die Anforderung selber, und bist ganz aus dem Schneider.
Ich frage mich, was du eigentlich für eine Antwort erwartet hast, wenn du eh schon alles weißt?

-
Artchi schrieb:
Ich frage mich, was du eigentlich für eine Antwort erwartet hast, wenn du eh schon alles weißt?

Hi, Du bist ja genauso schnell beleidigt wie ich

Aber kurz und gut: ich dachte, es gibt vielleicht eine Variante oder eine Option, die ich nicht kenne.
Achso: ich kann in den wenigen Fällen, wo das bei mir vorkommt, auch schreiben:
printf("len: %u\n", (unsigned int) len);