प्रिंट कैसे करें uint64_t? के साथ विफल रहता है: "स्वरूप में नकली '%'


133

मैंने प्रिंटफ़ uint64_t का एक बहुत ही सरल परीक्षण कोड लिखा है:

#include <inttypes.h>
#include <stdio.h>

int main()
{
  uint64_t ui64 = 90;
  printf("test uint64_t : %" PRIu64 "\n", ui64);
  return 0;
}

मैं इसे संकलित करने के लिए ubuntu 11.10 (64 बिट) और gcc संस्करण 4.6.1 का उपयोग करता हूं, लेकिन विफल रहा:

main.cpp: In function int main()’:
main.cpp:9:30: error: expected ‘)’ before PRIu64
main.cpp:9:47: warning: spurious trailing ‘%’ in format [-Wformat]

1
ऐसा लगता है कि आप C कोड को C ++ के रूप में संकलित कर रहे हैं, यह आपकी त्रुटि है। यदि आप अपनी फ़ाइल का नाम बदलकर main.cइसे gcc के साथ संकलित करते हैं, तो सभी को ठीक काम करना चाहिए।
जेन्स गुस्तेद

त्रुटि के बिना समान: stackoverflow.com/questions/9225567/…
Ciro Santilli 郝海东 over over over 病

या तो जीसीसी या क्लैंग के साथ, यह निर्दिष्ट करने के लिए -std=c11या आपके द्वारा उपयोग किए जा रहे मानक के संस्करण के लिए एक अच्छा विचार है । जो इसे और अन्य त्रुटियों को पकड़ता है। मैं भी -Wall -Wextra -Wpedantic -Wconversionकम से कम सलाह देता हूं ।
डेविस्लर

जवाबों:


164

ISO C99 मानक निर्दिष्ट करता है कि इन मैक्रोज़ को केवल तभी परिभाषित किया जाना चाहिए जब स्पष्ट रूप से अनुरोध किया गया हो।

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

... now PRIu64 will work

@, जवाब को चिह्नित करने के लिए मत भूलना (यदि आपकी समस्या हल हो गई है तो बाईं ओर चेकमार्क छवि पर क्लिक करें)।
जंक

9
हम्म, हेडर सहित बस पर्याप्त होना चाहिए। __STDC_FORMAT_MACROSमैक्रो केवल सी ++ में शामिल करने के लिए आवश्यक है।
जेन्स गुस्तेद

15
@ जैन: वास्तव में; __STDC_FORMAT_MACROSकेवल C99 में एक फुटनोट में दिखाई देता है, यह सुझाव देता है कि C ++ केवल अनुरोध की उपस्थिति में इन मैक्रोज़ को परिभाषित करता है। हालाँकि C ++ समिति ने सुझाव को अनदेखा करने के लिए चुना: उदाहरण के लिए n3242 ड्राफ्ट में, 27.9.2 / 3: नोट: <cinttypes> द्वारा परिभाषित मैक्रोज़ बिना शर्त के प्रदान किए गए हैं। विशेष रूप से, प्रतीक __STDC_FORMAT_MACROS, C मानक के फुटनोट 182 में उल्लिखित है, C ++ में कोई भूमिका नहीं निभाता है। इसलिए जब संकलक पकड़ते हैं, तो हमें __STDC_FORMAT_MACROSC या C ++ में आवश्यकता नहीं होगी ।
जॉन मार्शल

3
@ जॉन मार्शल जी ++ 4.7.3 को मैक्रो की आवश्यकता प्रतीत होती है, तब भी जब <inttypes.h> को शामिल किया जाता है।
क्रॉकेए

4
@ एरिक: जाहिरा तौर पर जी ++ 4.7.3 पकड़ा नहीं गया था! वास्तव में, शायद आप इसे एक ग्लिबेक संस्करण के साथ उपयोग कर रहे हैं जो इस बग को ठीक करता है । जैसा कि उस glibc रिपोर्ट में चर्चा की गई है, आपके g ++ 4.7.3 के libstdc ++ में इस समस्या को हल करने के लिए कोड है। यदि आप -std=c++0x<inttypes.h> के बजाय और शायद #include <cinttypes> के साथ संकलन करते हैं, तो मेरा मानना ​​है कि यह आपके द्वारा आपूर्ति किए बिना प्रारूप मैक्रो प्रदान करेगा __STDC_FORMAT_MACROS
जॉन मार्शल

4

जब सेंटोस 5.xi के तहत मेमेकिंग कंपाइल किया गया तो वही समस्या हुई।

समाधान है कि gcc और g ++ को 4.4 से कम से कम संस्करण में अपग्रेड किया जाए।

सुनिश्चित करें कि संकलन करने से पहले आपका CC / CXX सही बायनेरिज़ पर सेट (निर्यात) किया गया है।


1

चूंकि आपने C ++ टैग को शामिल किया है, आप {fmt} लाइब्रेरी का उपयोग कर सकते हैं और PRIu64मैक्रो और अन्य printfमुद्दों से पूरी तरह से बच सकते हैं:

#include <fmt/core.h>

int main() {
  uint64_t ui64 = 90;
  fmt::print("test uint64_t : {}\n", ui64);
}

इस लाइब्रेरी पर आधारित स्वरूपण सुविधा C ++ 20: P0645 में मानकीकरण के लिए प्रस्तावित है ।

अस्वीकरण : मैं {fmt} का लेखक हूं।


ठंडा! क्या यह भी कुछ इसी तरह से आ रहा है sscanf?
21

काफी संभवतः। हम जगह की संभावना की जांच कर रहे हैं scanf
विटाट

महान! इसके अलावा, मुझे आश्चर्य है कि अगर वहाँ एक स्वतंत्र और / या स्थानीय चयन संस्करण की दिशा में प्रगति हो रही है std::to_string()। Cppreference पेज अभी भी केवल उसी से लिंक होता है std::to_chars(), जिसे वास्तव में लोगों की आवश्यकता नहीं है। मुझे आश्चर्य है कि fmtऔर / या c ++ 20 इसके साथ सौदा या अभी तक नहीं।
0

std::to_stringशायद जैसा है वैसा ही रहेगा, लेकिन std::formatआपको नियंत्रित करने की अनुमति देता है कि लोकेल का उपयोग करें या नहीं (और डिफ़ॉल्ट रूप से यह लोकेल का उपयोग नहीं करता है)।
vitaut
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.