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.