Ich habe einen sehr einfachen Testcode von printf uint64_t geschrieben:
#include <inttypes.h>
#include <stdio.h>
int main()
{
uint64_t ui64 = 90;
printf("test uint64_t : %" PRIu64 "\n", ui64);
return 0;
}
Ich verwende Ubuntu 11.10 (64 Bit) und gcc Version 4.6.1, um es zu kompilieren, aber es ist fehlgeschlagen:
main.cpp: In function ‘int main()’:
main.cpp:9:30: error: expected ‘)’ before ‘PRIu64’
main.cpp:9:47: warning: spurious trailing ‘%’ in format [-Wformat]
main.c
und mit gcc kompilieren, sollte alles einwandfrei funktionieren.-std=c11
die Version des von Ihnen verwendeten Standards anzugeben . Das fängt diesen und andere Fehler auf. Ich empfehle auch-Wall -Wextra -Wpedantic -Wconversion
zumindest.Antworten:
Der ISO C99-Standard legt fest, dass diese Makros nur definiert werden dürfen, wenn dies ausdrücklich angefordert wird.
quelle
__STDC_FORMAT_MACROS
Makro wird nur für die Aufnahme in C ++ benötigt.__STDC_FORMAT_MACROS
wird in C99 nur in einer Fußnote angezeigt, was darauf hindeutet, dass C ++ diese Makros nur bei Vorhandensein der Anforderung definiert. Das C ++ - Komitee hat sich jedoch entschieden, den Vorschlag zu ignorieren: z. B. im Entwurf von n3242, 27.9.2 / 3: Hinweis: Die durch <cinttypes> definierten Makros werden unbedingt bereitgestellt. Insbesondere das in Fußnote 182 des C-Standards erwähnte Symbol __STDC_FORMAT_MACROS spielt in C ++ keine Rolle. Wenn die Compiler aufholen, brauchen wir__STDC_FORMAT_MACROS
weder C noch C ++.-std=c++0x
<cinttypes> anstelle von <inttypes.h> kompilieren und möglicherweise #include verwenden, werden die Formatmakros meiner Meinung nach ohne Ihre Angabe bereitgestellt__STDC_FORMAT_MACROS
.Beim Kompilieren von Memcached unter Centos 5.xi trat das gleiche Problem auf.
Die Lösung besteht darin, gcc und g ++ mindestens auf Version 4.4 zu aktualisieren.
Stellen Sie vor dem Kompilieren sicher, dass Ihr CC / CXX auf die richtigen Binärdateien eingestellt (exportiert) ist.
quelle
Da Sie das C ++ - Tag eingefügt haben, können Sie die {fmt} -Bibliothek verwenden und das
PRIu64
Makro und andereprintf
Probleme insgesamt vermeiden :Die auf dieser Bibliothek basierende Formatierungsfunktion wird zur Standardisierung in C ++ 20: P0645 vorgeschlagen .
Haftungsausschluss : Ich bin der Autor von {fmt}.
quelle
sscanf
?scanf
.std::to_string()
. Die cppreference-Seite verlinkt immer noch nur aufstd::to_chars()
, was die Leute nicht wirklich brauchen. Ich frage mich, obfmt
und / oder c ++ 20 damit umgehen oder noch nicht.std::to_string
wird wahrscheinlich unverändert bleiben, aberstd::format
Sie können steuern, ob das Gebietsschema verwendet werden soll oder nicht (und standardmäßig wird das Gebietsschema nicht verwendet).