কেন একটি সংকলক তার নিজের দ্বারা দুটি বার শিরোনাম ফাইলটি এড়াতে পারে না?


13

সি ++ তে নতুন! তাই আমি এটি পড়ছিলাম: http://www.learncpp.com/cpp-tutorial/110-a-first-look-at-the-preprocessor/

হেডার গার্ড

শিরোনাম ফাইলগুলি অন্য শিরোলেখ ফাইলগুলিকে অন্তর্ভুক্ত করতে পারে, তাই শিরোনাম ফাইলটি একাধিকবার অন্তর্ভুক্ত হওয়ার পরে এমন পরিস্থিতিতে শেষ হওয়া সম্ভব।

সুতরাং আমরা এড়াতে প্রিপ্রোসেসর নির্দেশিকা তৈরি করি। কিন্তু আমি নিশ্চিত নই - কেন কম্পাইলার শুধু ... না পারেন না দুইবার একই জিনিস আমদানি করবেন?

শিরোনামের রক্ষীরা alচ্ছিক (এই দৃশ্যত একটি ভাল অনুশীলন) দেওয়া সত্ত্বেও, এটি প্রায় আমাকে ভাবতে বাধ্য করে যে আপনি যখন দু'বার কিছু আমদানি করতে চান তখন এমন পরিস্থিতিতেও রয়েছে। যদিও আমি এ জাতীয় কোনও দৃশ্য নিয়ে মোটেও ভাবতে পারি না। কোন ধারনা?


এমএস সংকলকটিতে রয়েছে #pragma onceযা সংকলকটিকে কেবল একবার সেই ফাইলটি অন্তর্ভুক্ত করতে বলে।
কোডসইনচওস

উত্তর:


27

তারা করতে পারে, যেমন নতুন ভাষাগুলি দেখায়।

কিন্তু এই বছরগুলি আগে একটি ডিজাইনের সিদ্ধান্ত নেওয়া হয়েছিল (যখন সি সংকলকটি একাধিক স্বতন্ত্র পর্যায়ে ছিল) এবং এখন সামঞ্জস্যতা বজায় রাখতে পূর্ব-প্রসেসরকে প্রত্যাশার সাথে নিশ্চিত করে পুরানো কোড সংকলন করার জন্য একটি নির্দিষ্ট উপায়ে কাজ করতে হবে।

সি ++ যেমন সি থেকে শিরোনাম ফাইলগুলি প্রক্রিয়া করে তেমনি উত্তরাধিকার সূত্রে এটি একই কৌশলগুলি বজায় রেখেছিল। আমরা একটি পুরানো নকশা সিদ্ধান্ত সমর্থন করছি। তবে এটির কাজ করার পদ্ধতিটি পরিবর্তন করা খুব ঝুঁকিপূর্ণ কোডের সম্ভাব্য সংখ্যাটি ভেঙে যেতে পারে। সুতরাং এখন আমাদের ভাষার নতুন ব্যবহারকারীদের শিখতে হবে কীভাবে ব্যবহার করতে হবে রক্ষীদের অন্তর্ভুক্ত।

হেডার ফাইলগুলির সাথে কয়েকটি কৌশল আছে আপনি কি ইচ্ছাকৃতভাবে এটি একাধিকবার অন্তর্ভুক্ত করেছিলেন (এটি আসলে একটি দরকারী বৈশিষ্ট্য সরবরাহ করে না)। যদিও আমরা স্ক্র্যাচ থেকে দৃষ্টান্তটিকে নতুনভাবে ডিজাইন করেছি আমরা ফাইলগুলিকে অন্তর্ভুক্ত করার জন্য এটি অ-ডিফল্ট উপায়ে তৈরি করতে পারি।


7

এটি সি হিসাবে সামঞ্জস্য বজায় রাখা এবং এইভাবে একটি traditionalতিহ্যবাহী প্যাকিং সিস্টেমের পরিবর্তে প্রিপ্রোসেসরের সাথে চালিয়ে যাওয়া বেছে নেওয়ার কারণে এটি অন্যথায় এতটা ভাবপূর্ণ হবে না।

আমার মনে মনে আসে এমন একটি বিষয় হ'ল আমার এমন একটি প্রকল্প ছিল যা এপিআই ছিল। আমার দুটি হেডার ফাইল ছিল x86lib.hএবং x86lib_internal.h। অভ্যন্তরীণ বিশাল কারণ, আমি "জনসাধারণ" বিটগুলিকে x86lib.h এ আলাদা করে রেখেছি যাতে ব্যবহারকারীরা সংকলনের জন্য অতিরিক্ত সময় নির্ধারণ করতে না পারে।

এটি নির্ভরতাগুলির সাথে একটি মজার সমস্যাটির প্রবর্তন করেছে যদিও তাই আমি x86lib_ আন্তঃদেশে এই জাতীয় প্রবাহের সাথে শেষ করেছি

  1. ইন্টার্নাল প্রিপ্রোসেসর সংজ্ঞায়িত সেট করুন
  2. X86lib.h অন্তর্ভুক্ত করুন (যা অভ্যন্তরীণ সংজ্ঞায়িত করার সময় নির্দিষ্ট উপায়ে কাজ করতে স্মার্ট ছিল)
  3. কিছু স্টাফ করুন এবং x86lib.h এ ব্যবহৃত কিছু জিনিস পরিচয় করিয়ে দিন
  4. পূর্বপ্রসেসর সংজ্ঞায়নের পরে সেট করুন
  5. আবার x86lib.h অন্তর্ভুক্ত করুন (এবার এটি পৃথকীকরণের পরে অংশটি ব্যতীত সমস্ত কিছু উপেক্ষা করবে যা x86lib_ অন্তর্নিহিত উপাদানগুলির উপর নির্ভরশীল

আমি এটি বলার পক্ষে সবচেয়ে ভাল উপায় না বলব তবে এটি যা চেয়েছিল তা অর্জন করেছিল achieved


0

স্বয়ংক্রিয় সদৃশ-শিরোনাম বর্জন সহ একটি অসুবিধা হ'ল ফাইলের নাম কী অন্তর্ভুক্ত করে সে বিষয়ে সি স্ট্যান্ডার্ড তুলনামূলক নীরব। উদাহরণস্বরূপ, ধরুন যে সংকলন করা হচ্ছে মূল ফাইলটিতে নির্দেশনা রয়েছে #include "f1.h"এবং #include "f2.h"সেই নির্দেশাবলীর জন্য পাওয়া ফাইলগুলি উভয়ই রয়েছে #include "f3.h"। যদি f1.hএবং f2.hবিভিন্ন ডিরেক্টরিতে থাকে তবে সন্ধানের মাধ্যমে খুঁজে পাওয়া যায় যেগুলি পাথগুলি অন্তর্ভুক্ত করে, তবে এটি অস্পষ্ট হবে যে #includeএই ফাইলগুলির মধ্যে নির্দেশাবলী একই f3.hফাইলটি বা ভিন্ন ভিন্ন লোড করার উদ্দেশ্যে ছিল ।

আপেক্ষিক পাথ সহ ফাইল অন্তর্ভুক্ত করার সম্ভাবনাগুলিতে যদি কেউ যোগ করে তবে বিষয়গুলি আরও খারাপ হয়। কিছু ক্ষেত্রে যেখানে হেডার ফাইলগুলি নেস্টেডের জন্য আপেক্ষিক পাথ ব্যবহার করে থাকে সেগুলির মধ্যে নির্দেশিকা অন্তর্ভুক্ত থাকে এবং যেখানে কেউ সরবরাহ করা শিরোনাম ফাইলগুলিতে কোনও পরিবর্তন এড়াতে চায় না সেখানে কোনও প্রকল্পের ডিরেক্টরি কাঠামোর মধ্যে একাধিক স্থানে নথির একটি হেডার ফাইল থাকা প্রয়োজন। যদিও এই শিরোলেখ ফাইলটির একাধিক দৈহিক অনুলিপি উপস্থিত রয়েছে, সেগুলি শব্দার্থভাবে বিবেচনা করা উচিত যেন তারা একক ফাইল।

যদি #pragma onceনির্দেশটি কোনও শনাক্তকারীকে অনুসরণ করার অনুমতি দেয় once, শব্দার্থকগুলির সাথে যে সংকলকটি ফাইলটি এড়ানো উচিত যদি সনাক্তকারী পূর্বের মুখোমুখি #pragma onceনির্দেশিকার সাথে কোনওটির সাথে মেলে , তবে শব্দার্থবিজ্ঞানটি দ্ব্যর্থহীন হবে; একটি সংকলক যা বলতে পারে যে কোনও #includeনির্দেশিকা একই- #pragma onceট্যাগড ফাইলটিকে আগের হিসাবে লোড করবে , এটি ফাইলটি আবার না খোলায় এড়িয়ে কিছুটা সময় সাশ্রয় করতে পারে, তবে এই ধরণের সনাক্তকরণটি শব্দার্থগতভাবে গুরুত্বপূর্ণ হবে না কারণ ফাইলটি এড়ানো যায় কিনা অথবা ফাইল নামটি ম্যাচ হিসাবে স্বীকৃত ছিল না। যাইহোক, কোনও কম্পাইলার সেভাবে কাজ করার বিষয়ে আমি অসচেতন। একটি সংকলক থাকার সাথে পর্যবেক্ষণ করুন যে কোনও ফাইল প্যাটার্নের সাথে মেলে কিনা #ifndef someIdentifier / #define someIdentifier / #endif [for that ifndef] / nothing followingএবং যদি এমনটির সাথে উপরের সমতুল্য আচরণ করে #pragma once someIdentifierতবেsomeIdentifier সংজ্ঞায়িত অবশেষ, মূলত হিসাবে ভাল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.