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;
}

আমি এটি সঙ্কলন করতে উবুন্টু ১১.১০ (bit৪ বিট) এবং জিসিসি সংস্করণ ৪.6.১ ব্যবহার করি, তবে ব্যর্থ:

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
দেখে মনে হচ্ছে আপনি সি কোডটি সি ++ হিসাবে সংকলন করছেন, এটি আপনার ত্রুটি। আপনি যদি নিজের ফাইলটির নাম পরিবর্তন করেন main.cএবং এটি জিসিসি দিয়ে সংকলন করেন, সমস্তই ঠিকঠাক কাজ করা উচিত।
জেনস গুস্ট্ট


জিসিসি বা ঝাঁকুনির সাথে, -std=c11আপনি যে স্ট্যান্ডার্ডটি ব্যবহার করছেন তার সংস্করণ নির্দিষ্ট করা ভাল ধারণা । এটি এই এবং অন্যান্য ত্রুটিগুলি ধরা দেয়। আমিও -Wall -Wextra -Wpedantic -Wconversionকমপক্ষে সুপারিশ করি ।
ডেভিস্লোর

উত্তর:


164

আইএসও সি 99 স্ট্যান্ডার্ড নির্দিষ্ট করে যে এই ম্যাক্রোগুলি কেবলমাত্র স্পষ্টভাবে অনুরোধ করা হলে সংজ্ঞায়িত করতে হবে।

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

... now PRIu64 will work

@ ড্যান, উত্তরটি স্বীকৃত হিসাবে চিহ্নিত করতে ভুলবেন না (বাম দিকে চেকমার্ক চিত্রটি ক্লিক করুন) যদি এটি আপনার সমস্যার সমাধান করে।
জেনাক

9
এইচএম, কেবল শিরোনাম সহ যথেষ্ট should __STDC_FORMAT_MACROSম্যাক্রো শুধুমাত্র সি ++ অন্তর্ভুক্তির জন্য প্রয়োজন হয়।
জেনস গুস্ট্ট

15
@ জেনস: প্রকৃতপক্ষে; __STDC_FORMAT_MACROSকেবলমাত্র C99 এর একটি পাদটীকাতে উপস্থিত হবে, প্রস্তাবিত যে সি ++ কেবলমাত্র অনুরোধের উপস্থিতিতে এই ম্যাক্রোগুলি সংজ্ঞায়িত করবে। তবে সি ++ কমিটি এই পরামর্শটিকে উপেক্ষা করতে পছন্দ করেছে: যেমন n3242 খসড়াতে, ২.9.৯.২ / 3: দ্রষ্টব্য: <cinttyype> দ্বারা সংজ্ঞায়িত ম্যাক্রোগুলি নিঃশর্তভাবে সরবরাহ করা হয়েছে। বিশেষত, সি স্ট্যান্ডার্ডের 182 পদক্ষেপে উল্লিখিত, __STDC_FORMAT_MACROS চিহ্নটি সি ++ তে কোনও ভূমিকা রাখে না। সুতরাং যখন সংকলকগুলি ধরা পড়বে তখন আমাদের __STDC_FORMAT_MACROSসি বা সি ++ এর মধ্যে কোনও প্রয়োজন হবে না ।
জন মার্শাল

3
@ জন মার্শাল জি ++ 4.7.3 ম্যাক্রোর প্রয়োজন বলে মনে হচ্ছে, <inttyype.h> অন্তর্ভুক্ত থাকা অবস্থায়ও।
crockeea

4
@ এরিক: স্পষ্টতই g ++ 4.7.3 ধরা পড়ে নি! প্রকৃতপক্ষে, আপনি সম্ভবত এটি একটি গ্লিবিক সংস্করণ দিয়ে ব্যবহার করছেন যা এই বাগ ফিক্সটির পূর্বাভাস দেয় । যে গ্লিবসি রিপোর্টে আলোচিত হয়েছে, আপনার জি ++ 4.7.3 এর লিবিস্টডিসি ++ এর এই সমস্যাটি সমাধান করার কোড রয়েছে। যদি আপনি -std=c++0x<< টাইপস> এর পরিবর্তে # অন্তর্ভুক্ত <সিনটি টাইপস> সংকলন করে থাকেন এবং আমি আপনাকে সরবরাহ না করে ফর্ম্যাট ম্যাক্রোগুলি সরবরাহ করে তা বিশ্বাস করি __STDC_FORMAT_MACROS
জন মার্শাল

4

Centos 5.xi এর অধীনে মেমক্যাচ করে সংকলন করার সময় একই সমস্যা পেয়েছিল।

সমাধানটি হ'ল কমপক্ষে 4.৪ সংস্করণে জিসিসি এবং জি ++ আপগ্রেড করা।

আপনার সিসি / সিএক্সএক্স সংকলনের আগে ডান বাইনারিগুলিতে সেট (রফতানি করা) রয়েছে কিনা তা নিশ্চিত করুন।


1

আপনি যেহেতু সি ++ ট্যাগ অন্তর্ভুক্ত করেছেন তাই আপনি {fmt} লাইব্রেরিটি ব্যবহার করতে এবং PRIu64ম্যাক্রো এবং অন্যান্য printfসমস্যাগুলি পুরোপুরি এড়িয়ে যেতে পারেন :

#include <fmt/core.h>

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

এই লাইব্রেরির উপর ভিত্তি করে ফর্ম্যাটিং সুবিধাটি সি ++ 20: P0645 তে মানিকরণের জন্য প্রস্তাবিত ।

দাবি অস্বীকার: আমি {fmt of এর লেখক}


শান্ত! এটিও কি একই রকম কিছু আসছে sscanf?
ceztko

বেশ সম্ভবত। আমরা প্রতিস্থাপনের সম্ভাবনাটি তদন্ত করছি scanf
ভিটায়ট

গ্রেট! এছাড়াও আমি অবাক হই যে কোনও লোকেলের স্বাধীন এবং / অথবা স্থানীয় নির্বাচনযোগ্য সংস্করণের দিকে অগ্রগতি আছে কিনা std::to_string()। সিপ্রেফারেন্স পৃষ্ঠাটি এখনও কেবলমাত্র এর সাথে লিঙ্ক করে std::to_chars(), যা মানুষের প্রয়োজনের মতো নয়। আমি fmtএবং / অথবা সি ++ 20 এটির সাথে চুক্তি করে কিনা তা এখনও অবাক হয়েছি I
ceztko

std::to_stringসম্ভবত যেমন রয়েছে তেমন থাকবে, তবে std::formatআপনাকে লোকেল ব্যবহার করতে হবে কিনা তা নিয়ন্ত্রণ করতে দেয় (এবং ডিফল্টরূপে এটি লোকেল ব্যবহার করে না)।
ভিটআউট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.