জিসিসির এঙ্গেল-বন্ধনীর বাস্তবায়নের অন্তর্ভুক্ত। এটি নীচে বর্ণিত হিসাবে কেন হতে হবে?


10

এই বিভাগের ২.6 বিভাগে এই নথিটির নিম্নলিখিত অনুচ্ছেদ রয়েছে:

যদি লাইনটি <টোকেন এবং একটি> টোকেন সহ শুরু করে একটি টোকেন স্ট্রিমে প্রসারিত হয়, তবে <এবং প্রথম> এর মধ্যে টোকেনগুলি একত্রিত করে ফাইলের নাম তৈরি করে। টোকেনগুলির মধ্যে যে কোনও সাদা জায়গা একক স্থানে হ্রাস করা হয়েছে; তারপরে প্রাথমিক <এর পরে যে কোনও স্থান বজায় রাখা হয় তবে সমাপনের আগে একটি পিছন স্থান> উপেক্ষা করা হয় । সিপিসি এঙ্গেল-বন্ধনীর জন্য নিয়ম অনুসারে ফাইলটি অনুসন্ধান করে।

আমি জানি এটি বাস্তবায়ন সংজ্ঞায়িত, তবে কেন এটি জিসিসির পক্ষে এটি হতে হবে? আমি উপরের হাইলাইট করা বাক্যটি বিশেষভাবে উল্লেখ করছি।

সম্পাদনা

আমি কেবল লক্ষ্য করেছি যে উপরে বর্ণিত একটি তৃতীয় অনুচ্ছেদে নিম্নলিখিতটি বলেছে:

আপনি যখন ম্যাক্রো সংজ্ঞা দেবেন তখন আপনাকে অবশ্যই যত্নবান হতে হবে। #defineটোকেন সংরক্ষণ করে, পাঠ্য নয়। প্রিপ্রসেসরটি জানার কোনও উপায় নেই যে ম্যাক্রোর যুক্তি হিসাবে ব্যবহৃত হবে #include, সুতরাং এটি শিরোনামের নাম নয়, সাধারণ টোকেন উত্পন্ন করে। যদি আপনি ডাবল-কোট অন্তর্ভুক্ত ব্যবহার করেন তবে এটি সমস্যার কারণ হওয়ার সম্ভাবনা নেই, যা স্ট্রিং ধ্রুবকের কাছে পর্যাপ্ত are যদি আপনি কোণ বন্ধনী ব্যবহার করেন তবে আপনার সমস্যা হতে পারে

কেউ কি জানেন যে এখানে কী ধরণের সমস্যা দেখানো হচ্ছে?


6
সর্বোত্তম অনুমান যে জিসিসির বিকাশকারীরা মনে করেন যে কোনও ফাইল নামের শেষে ফাঁকা স্থানগুলি একটি ঘৃণা।
ব্যবহারকারী 3386109

1
নেতৃস্থানীয় এবং / অথবা চলমান স্থানগুলির সাথে ফাইলের নামগুলি বিশেষত উইন্ডোজের সাথে জাগতে খুব চতুর ick
রেমি লেবউ

1
এটি কারণ হিসাবে এটি সংজ্ঞায়িত করা হয়েছে, অগত্যা এটির অর্থ এটির মতো সংজ্ঞা দিতে হবে না। এটি মান দ্বারা বাধ্যতামূলক নয়।
এরেরিকা

ভিজ্যুয়াল স্টুডিও প্রাথমিক এবং শেষ উভয় স্থান সরিয়ে দেয়, তাই অন্যরকম আচরণ করে। এইচপি দুদক জিসিসির মতো আচরণ করে (সম্ভবত সামঞ্জস্যের কারণে)।
স্লিমাক

কখনও কখনও ডকুমেন্টেশনগুলি সহজভাবে বর্ণনা করে যে কোডটি কী করতে হবে তার পরিবর্তে অন্যান্য উপায়ের পরিবর্তে, বিশেষত যে ক্ষেত্রে কিছু যায় আসে না (আপনি যদি ডাবল কোট ব্যবহার করেন তবে আপনি যে কোনও স্থান ব্যবহার করতে পারেন)।
rustyx

উত্তর:


8

আমার ধারণা, বাস্তবায়নকারীরা যখন খুব বেশি চিন্তাভাবনা না করে এই কার্যকারিতাটি কার্যকর করেন তখন সবচেয়ে সহজ উপায়টি বেছে নিয়েছিলেন।

দেখে মনে হচ্ছে প্রাথমিক বাস্তবায়ন 2000-07-03 এ অবতরণ করেছে (দুই দশক আগে!)। প্রাসঙ্গিক অংশটি দেখতে ( উত্স ):

  for (;;)
    {
      t = cpp_get_token (pfile);
      if (t->type == CPP_GREATER || t->type == CPP_EOF)
        break;

      CPP_RESERVE (pfile, TOKEN_LEN (t));
      if (t->flags & PREV_WHITE)
        CPP_PUTC_Q (pfile, ' ');
      pfile->limit = spell_token (pfile, t, pfile->limit);
    }

উল্লেখযোগ্যভাবে, এটি টোকেনটির স্মৃতি সংরক্ষণ করার আগেCPP_GREATER টোকেনটি (অর্থাত্ >) দেখলে এটি ভেঙে যায় । এটি বোঝা যায়, যেহেতু টোকেন বাফারটিতে লেখা হবে না তখন মেমরি বরাদ্দ করার দরকার নেই।

তারপরে, কেবল মেমরি সংরক্ষিত হওয়ার পরে , প্রিপ্রসেসর চেক করে যে টোকেনটির পূর্ববর্তী সাদা অংশ ( t->flags & PREV_WHITE) রয়েছে এবং যখন এটি হয়, তখন বাফারে একটি শ্বেত স্পেস অক্ষর লিখে থাকে।

ফলস্বরূপ, < foo / bar >কেবলমাত্র শ্বেতস্থান আগে foo(যা প্রাথমিকের পরে <) /, এবং barরাখা হয়।


জমকালো, দুর্দান্ত উত্তর। এই প্রথম আমি জিসিসিতে কোনও টুকরো কোড দেখার সুযোগ পেয়েছি। এই জন্য আপনাকে ধন্যবাদ.
আয়রোসা

তবে শর্তটি if (t->flags & PREV_WHITE) CPP_PUTC_Q (pfile, ' ');নথিতে যা বলা হচ্ছে তার সাথে এই মতবিরোধ করে না: "টোকেনের মধ্যে যে কোনও শ্বেত স্থান একক জায়গায় কমিয়ে দেওয়া হয়েছে; ..."?
আয়রোসা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.