# অন্তর্ভুক্ত <ফাইল নাম> এবং # অন্তর্ভুক্ত "ফাইলের নাম" এর মধ্যে পার্থক্য কী?


2353

সি এবং সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজে, includeনিম্নরূপে কোণ বন্ধনী ব্যবহার এবং একটি বিবৃতিতে উদ্ধৃতি ব্যবহারের মধ্যে পার্থক্য কী ?

  1. #include <filename>
  2. #include "filename"



ভিজ্যুয়াল স্টুডিওর আচরণের জন্য, দয়া করে চেক করুন: ডকস.মাইক্রোসফট.ইন
ইউএসসিপি

উত্তর:


1402

অনুশীলনে, পার্থক্যটি সেই স্থানে যেখানে প্রিপ্রসেসর অন্তর্ভুক্ত ফাইলটির জন্য অনুসন্ধান করে।

#include <filename>একটি বাস্তবায়ন নির্ভর পদ্ধতিতে প্রিপ্রসেসর অনুসন্ধানগুলির জন্য , সাধারণত সংকলক / আইডিই দ্বারা পূর্বনির্ধারিত অনুসন্ধান ডিরেক্টরিগুলিতে। এই পদ্ধতিটি সাধারণত স্ট্যান্ডার্ড লাইব্রেরির শিরোনাম ফাইলগুলি অন্তর্ভুক্ত করতে ব্যবহৃত হয়।

#include "filename"প্রিপ্রসেসর জন্য প্রথমে একই ডিরেক্টরিতে ডিরেক্টরি সহ ফাইলটি অনুসন্ধান করে এবং তারপরে #include <filename>ফর্মটির জন্য ব্যবহৃত অনুসন্ধানের পথটি অনুসরণ করে । এই পদ্ধতিটি সাধারণত প্রোগ্রামার-সংজ্ঞায়িত হেডার ফাইলগুলি অন্তর্ভুক্ত করতে ব্যবহৃত হয়।

অনুসন্ধানের পথে জিসিসি ডকুমেন্টেশনে আরও সম্পূর্ণ বিবরণ পাওয়া যায় ।


135
বিবৃতি: "প্রিপ্রসেসর একই ডিরেক্টরিতে অনুসন্ধান করে ..." বাস্তবে সত্য হতে পারে তবে মানকটি উল্লেখ করে যে নামক উত্স ফাইলটি "একটি প্রয়োগ-সংজ্ঞায়িত পদ্ধতিতে অনুসন্ধান করা হয়"। পাইকুকির উত্তর দেখুন।
রিচার্ড কর্ডেন

60
আপনার উত্তরটি "সত্য" বলে মনে হতে পারে, কারণ এটি কনভেনশন অনুসারে কতগুলি বাস্তবায়ন কাজ করে, আপনার আইয়েব এবং পাইকুকির উত্তরগুলি ঘুরে দেখুন। তারা উভয়ই সি সি স্ট্যান্ডার্ডের শব্দের সাহায্যে উল্লেখ করেছেন: আসল পার্থক্য হ'ল "হেডার" বনাম "উত্স ফাইল" এর অন্তর্ভুক্তি (এবং না, এর অর্থ ".h" বনাম "নয়। গ ")। এই প্রসঙ্গে "উত্স ফাইল" হতে পারে (এবং সাধারণত হয়, এবং প্রায় সর্বদা হওয়া উচিত) একটি ".h" ফাইল। একটি শিরোনাম অগত্যা ফাইল হওয়ার দরকার নেই (একটি সংকলক উদাহরণস্বরূপ কোনও শিরোনামকে অন্তর্ভুক্ত করতে পারে যা কোনও ফাইলের মধ্যে নয়) stat
ড্যান মোল্ডিং

5
"... প্রিপ্রসেসর ফাইলটি অন্তর্ভুক্ত করার জন্য ফাইলটি যেভাবে সংকলন করা হচ্ছে একই ডিরেক্টরিতে অনুসন্ধান করে।" এই বিবৃতি সম্পূর্ণ সঠিক নয়। আমি এই প্রশ্নে আগ্রহী ছিলাম কারণ আসল উত্তরটি কী তা জানতে আগ্রহী ছিলাম তবে আমি জানি এটি সত্য নয় কারণ আপনি যখন অন্তর্ভুক্ত একটি অতিরিক্ত অন্তর্ভুক্ত পথ নির্দিষ্ট করে অন্তত জিসিসি দিয়ে থাকেন যা # অন্তর্ভুক্ত "ফাইলের নামের সাথে উল্লিখিত ফাইলগুলি অনুসন্ধান করবে। এইচ "
গ্যাব্রিয়েল দক্ষিণী

9
যারা উত্তর পছন্দ করেন না, দয়া করে একটি ব্যবহারিক উদাহরণ দিন, যেখানে এটি ভুল।
0kcats

1
নিশ্চিতভাবেই, আমি সম্প্রতি 'একই' লাইব্রেরির শিরোনামগুলি অন্তর্ভুক্ত করার সাথে সাথে এই সিনট্যাক্সগুলি মিশ্রিত করেছি এবং পুনরায় সংজ্ঞা ত্রুটিগুলি দিয়ে শেষ করেছি। যদি আমি সঠিকভাবে বুঝতে পারি #include <...>তবে সিস্টেমে ইনস্টল করা প্যাকেজটি #include "..."ব্যবহার করে এবং কাছাকাছি সংগ্রহস্থল সংস্করণ ব্যবহার করেছি। আমার পেছনের দিকে থাকতে পারে। যেভাবেই হোক, প্যাকেজড শিরোনামে অন্তর্ভুক্ত রক্ষককে একটি আন্ডারস্কোর দিয়ে উপস্থাপিত করা হয়। (এটি প্যাকেজগুলির জন্য একটি সম্মেলন হতে পারে বা সম্ভবত ইচ্ছাকৃতভাবে দুটি মিশ্রণ প্রতিরোধের একটি উপায় হতে পারে, যদিও সংস্করণ
জন পি

713

জানার একমাত্র উপায় হ'ল আপনার প্রয়োগের ডকুমেন্টেশনগুলি পড়া।

ইন সি মান , বিভাগ 6.10.2, অনুচ্ছেদ 2 4 রাজ্য:

  • ফর্মটির একটি পূর্বনির্ধারিত নির্দেশিকা

    #include <h-char-sequence> new-line

    শিরোনাম< এবং >ডিলিমিটারগুলির মধ্যে নির্দিষ্ট ক্রম দ্বারা স্বতন্ত্রভাবে চিহ্নিত শিরোনামের জন্য বাস্তবায়ন-সংজ্ঞায়িত জায়গাগুলির ক্রম সন্ধান করে এবং শিরোনামের পুরো বিষয়বস্তু দ্বারা সেই নির্দেশকে প্রতিস্থাপনের কারণ ঘটায় । স্থানগুলি কীভাবে নির্দিষ্ট করা হয় বা শিরোনাম সনাক্ত করা হয় তা প্রয়োগ-সংজ্ঞায়িত।

  • ফর্মটির একটি পূর্বনির্ধারিত নির্দেশিকা

    #include "q-char-sequence" new-line

    ডিলিমিটারগুলির মধ্যে নির্দিষ্ট ক্রম দ্বারা চিহ্নিত উত্স ফাইলের সম্পূর্ণ বিষয়বস্তু দ্বারা সেই নির্দেশকে প্রতিস্থাপনের কারণ ঘটায় "। নামকরণ করা উত্স ফাইলটি একটি প্রয়োগ-সংজ্ঞায়িত পদ্ধতিতে অনুসন্ধান করা হয়। যদি এই অনুসন্ধানটি সমর্থিত না হয়, বা অনুসন্ধান ব্যর্থ হয় তবে নির্দেশটি পুনরায় প্রসেস করা হয় যেন এটি পড়ে

    #include <h-char-sequence> new-line

    >মূল নির্দেশ থেকে একই রকম ক্রম ( অক্ষর সহ , যদি থাকে) সহ

  • ফর্মটির একটি পূর্বনির্ধারিত নির্দেশিকা

    #include pp-tokens new-line

    (এটি আগের দুটি ফর্মের একটির সাথে মেলে না) অনুমোদিত। includeনির্দেশের পরে প্রিপ্রোসেসিং টোকেনগুলি সাধারণ পাঠ্যের মতোই প্রক্রিয়া করা হয়। (বর্তমানে ম্যাক্রোর নাম হিসাবে সংজ্ঞায়িত প্রতিটি শনাক্তকারী তার প্রস্রোসেসিং টোকেনগুলির প্রতিস্থাপনের তালিকার দ্বারা প্রতিস্থাপিত হয়)) সমস্ত প্রতিস্থাপনের পরে প্রাপ্ত নির্দেশাবলী পূর্ববর্তী দুটি ফর্মের মধ্যে একটির সাথে মেলে। একটি <এবং একটি >প্রিপ্রসেসিং টোকেন জোড় বা "অক্ষরের একটি জুটির মধ্যে প্রোক্রোসিং টোকেনগুলির ক্রমটি একটি একক শিরোনাম নামের প্রিপ্রোসেসিং টোকেনের সাথে সংযুক্ত করে প্রয়োগকরণ-সংজ্ঞায়িত।

সজ্ঞা:

  • এইচ-চর: নতুন লাইন চরিত্র এবং বাদে উত্স চরিত্রের যে কোনও সদস্য সেট করুন >

  • কিউ-চর: নতুন লাইন চরিত্র এবং বাদে উত্স চরিত্রের যে কোনও সদস্য সেট করুন "



27
বাস্তবায়ন সংজ্ঞায়িত জায়গাগুলির জন্য @ পাইকুকি উভয় <ফাইল ফাইল> এবং "ফাইলের নাম" অনুসন্ধান করুন। তাহলে পার্থক্য টা কি ?
onmyway133

15
@ স্টেফান, আমি কেবলমাত্র সেই মানটি উদ্ধৃত করছি যা INCLUDE_PATH সম্পর্কে কিছুই বলে না। আপনার বাস্তবায়ন এটি করতে পারে, এবং আমার নাও পারে। মূল প্রশ্নটি জেনারালি সি ছিল এবং নির্দিষ্টভাবে সিসিসি নয় (যা আমি মনে করি না INCLUDE_PATH ব্যবহার করে) অথবা মাইক্রোসফ্ট সি (যা আমি মনে করি) বা অন্য কোনও, তাই এর উত্তর সাধারণভাবে দেওয়া যাবে না তবে পরিবর্তে প্রতিটি বাস্তবায়নের ডকুমেন্টেশন অবশ্যই রেফারেন্স করা উচিত।
পাইকুকি

12
এই সমস্ত পরিস্থিতিতে যেমন কংক্রিট উদাহরণ (বিশেষত সাধারণ পরিস্থিতিতে) প্রচুর দরকারী এবং সমানভাবে প্রশংসা করা হয়। অগত্যা জেনেরিক জবাবগুলিকে নিখুঁতভাবে ব্যবহারিক ব্যবহার করতে হবে না।
ভার্জিনিয়ান

132
"এখানে সি স্ট্যান্ডার্ডটি কীভাবে
ভার্বোজ

287

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

যদি #include "file"ফর্মটি ব্যবহার করা হয়, তবে বাস্তবায়নটি প্রথমে প্রদত্ত নামের একটি ফাইল অনুসন্ধান করে যদি সমর্থন করে। (সমর্থিত) না থাকলে, বা অনুসন্ধান ব্যর্থ হলে, বাস্তবায়ন অন্য ( #include <file>) ফর্মটি ব্যবহার করার মতো আচরণ করে ।

এছাড়াও, একটি তৃতীয় ফর্ম বিদ্যমান এবং যখন #includeনির্দেশটি উপরের কোনও ফর্মের সাথে মেলে না তখন ব্যবহৃত হয়। এই ফর্মটিতে, #includeনির্দেশের "অপারেশনগুলি" তে কিছু প্রাথমিক প্রাকপ্রসেসিং (যেমন ম্যাক্রো এক্সপেনশন) করা হয় এবং ফলাফলটি অন্য দুটি ফর্মের মধ্যে একটির সাথে মিলবে বলে আশা করা যায়।


50
+1, এটি সম্ভবত এখানে সবচেয়ে সংক্ষিপ্ত এবং সঠিক উত্তর। মান অনুসারে (যা পাইকুকি তার উত্তরে উদ্ধৃতি দিয়েছিল), কেবল আসল পার্থক্য হ'ল "শিরোনাম" বনাম "উত্স ফাইল"। অনুসন্ধান পদ্ধতিটি কোনওভাবেই বাস্তবায়ন-সংজ্ঞায়িত। ডাবল উদ্ধৃতি ব্যবহারের অর্থ হ'ল আপনি একটি "উত্স ফাইল" অন্তর্ভুক্ত করতে চান, যখন অ্যাঙ্গেল বন্ধনী বলতে বোঝায় যে আপনি একটি "শিরোনাম" অন্তর্ভুক্ত করবেন যা আপনি যেমন বলেছেন, তেমন কোনও ফাইলই নয়।
ড্যান মোল্ডিং

3
কোয়েস্ট 49 এর উত্তরের জন্য ড্যান মোল্ডিংয়ের মন্তব্য দেখুন; স্ট্যান্ডার্ড শিরোনামগুলি ফাইল ফর্মে থাকতে হবে না, সেগুলি অন্তর্নির্মিত হতে পারে।
aib

10
আমি এক দশক ধরে এই "স্ট্যান্ডার্ড শিরোনামগুলিকে ফাইল আকারে থাকতে হবে না" পড়ছি। একটি বাস্তব বিশ্বের উদাহরণ প্রদান যত্ন?
ম্যাক্সিম এগারুশকিন

12
@ ম্যাক্সিম ইয়েগারুশকিন: আমি বিদ্যমান কোন বাস্তব-উদাহরণের কথা ভাবতে পারি না; তবে, MS-DOS এর জন্য কোনও সম্পূর্ণ সি 11 সংকলক উপস্থিত থাকতে পারে না যদি না হেডারের ফাইল না থাকে files এর কারণ হল কিছু সি 11 শিরোনামের নাম "8.3" এমএস-ডস ফাইলের নাম সীমাবদ্ধতার সাথে সামঞ্জস্যপূর্ণ নয়।
ড্যান মোল্ডিং

18
@ ম্যাক্সিমএগুরুশকিন: ভ্যাক্স / ভিএমএস সি সংকলক সমস্ত সি রানটাইম লাইব্রেরি শিরোনামকে একটি একক পাঠ্য লাইব্রেরী ফাইলে রাখে (একটি ইউনিক্স সংরক্ষণাগারের অনুরূপ) এবং লাইব্রেরিতে সূচকের মূল হিসাবে <এবং এর মধ্যবর্তী স্ট্রিংটি ব্যবহার করে >
অ্যাড্রিয়ান ম্যাকার্থি

117

কিছু ভাল উত্তর এখানে সি স্ট্যান্ডার্ডের রেফারেন্স দেয় তবে পসিক্স স্ট্যান্ডার্ডকে ভুলে যায়, বিশেষত সি 99 (যেমন সি সংকলক) কমান্ডের নির্দিষ্ট আচরণ ।

মতে ওপেন গ্রুপ বেজ উল্লেখ ইস্যু 7 ,

-আমি ডিরেক্টরি

শিরোনাম অনুসারে শিরোনামগুলির অনুসন্ধানের জন্য অ্যালগরিদম পরিবর্তন করুন যার নামগুলি যথাযথ পথের নাম নয় যা সাধারণত স্থানগুলিতে সন্ধানের আগে ডিরেক্টরিটির নামের নাম অনুসারে ডিরেক্টরিটি অনুসন্ধান করা হয়। সুতরাং, যাদের নামগুলি ডাবল-কোট ("") এ আবদ্ধ রয়েছে তাদের প্রথমে # অন্তর্ভুক্ত রেখার সাথে ফাইলের ডিরেক্টরিতে অনুসন্ধান করা হবে , তারপরে -I বিকল্পগুলির নামের ডিরেক্টরিতে এবং সাধারণ স্থানে সর্বশেষে অনুসন্ধান করা হবে। যাদের শিরোনামগুলির নাম কোণ বন্ধনী ("<>") এ আবদ্ধ রয়েছে, তাদের শিরোনামটি কেবলমাত্র -I বিকল্পগুলির নামের ডিরেক্টরিতে এবং তারপরে সাধারণ জায়গাগুলিতে অনুসন্ধান করা হবে। -I বিকল্পগুলির মধ্যে নামের ডিরেক্টরিগুলি নির্দিষ্ট ক্রমে অনুসন্ধান করা হবে searchedc99 কমান্ড প্রার্থনা।

সুতরাং, একটি পসিক্স অনুগত পরিবেশে, একটি পসিক্স কমপ্লায়েন্ট সি সংকলক সহ, #include "file.h"সম্ভবত ./file.hপ্রথমে অনুসন্ধান করতে যাচ্ছে , যেখানে স্টেটমেন্ট .সহ ফাইলটি রয়েছে সেই ডিরেক্টরিটি যেখানে সম্ভবত প্রথম অনুসন্ধান করতে চলেছে , আপনার সিস্টেমটি কোথায় সংজ্ঞায়িত করা হয়েছে? শিরোনামের জন্য স্বাভাবিক জায়গা (এটি পসিক্স দ্বারা সংজ্ঞায়িত করা হয় না বলে মনে হয়)।#include#include <file.h>/usr/include/file.h/usr/include


1
পাঠ্যের সঠিক উত্স কী? এটি আইইইইএস 1003.1, 2013 এর আদর্শিক অংশ থেকে?
osgx

7
@osgx: সেই শব্দটি (বা চূড়ান্ত অনুরূপ কিছু) এর জন্য পসিএক্স স্পেসিফিকেশন পাওয়া যায় c99- যা সি সংকলকটির পসিক্স নাম। (পোসিএক্স ২০০৮ স্ট্যান্ডার্ডটি খুব শক্তভাবেই সি 11 এর উল্লেখ করতে পারে; পোসিক্স ২০০৮-এর 2013 আপডেটটি যে সি মান হিসাবে উল্লেখ করেছে তা পরিবর্তন করে নি।)
জোনাথন লেফলার

1
এটি আমার প্রথম চিন্তাও ছিল। জিসিসির ম্যানপেজটিতে অন্যদের মতো এটি অন্তর্ভুক্ত রয়েছে। গ্রন্থাগারগুলির জন্যও একই জিনিস রয়েছে - -L
প্রাইফটান

50

জিসিসির ডকুমেন্টেশন দুটির মধ্যে পার্থক্য সম্পর্কে নিম্নলিখিতটি বলে :

ব্যবহারকারী এবং সিস্টেম উভয় শিরোনাম ফাইল প্রিপ্রসেসিং নির্দেশিকা ব্যবহার করে অন্তর্ভুক্ত ‘#include’। এটির দুটি রূপ রয়েছে:

#include <file>

সিস্টেমের শিরোনাম ফাইলগুলির জন্য এই রূপটি ব্যবহৃত হয়। এটি সিস্টেম ডিরেক্টরিগুলির একটি স্ট্যান্ডার্ড তালিকায় ফাইল নামের একটি ফাইল অনুসন্ধান করে। আপনি -Iবিকল্পের সাহায্যে এই তালিকায় ডিরেক্টরিগুলি প্রেন্ডেন্ড করতে পারেন ( আমন্ত্রণ দেখুন )।

#include "file"

এই রূপটি আপনার নিজের প্রোগ্রামের শিরোনাম ফাইলগুলির জন্য ব্যবহৃত হয়। এটি বর্তমান ফাইল যুক্ত ডিরেক্টরিতে প্রথমে উদ্ধৃতি ডিরেক্টরিতে এবং তারপরে একই ডিরেক্টরিগুলির জন্য ব্যবহৃত ফাইলের নামের ফাইল অনুসন্ধান করে <file>। আপনি -iquoteবিকল্পটি দিয়ে উদ্ধৃতি ডিরেক্টরিগুলির তালিকাতে ডিরেক্টরিগুলি প্রেন্ডেন্ড করতে পারেন । ‘#include’কোট চিহ্ন বা কোণ বন্ধনী দিয়ে সীমিত করা হোক না কেন এর যুক্তি মন্তব্যগুলির স্বীকৃতিপ্রাপ্ত নয় এবং ম্যাক্রোর নামগুলি প্রসারিত হয় নি এমন স্ট্রিং ধ্রুবকের মতো আচরণ করে। সুতরাং, #include <x/*y>একটি সিস্টেম শিরোনাম ফাইল নাম অন্তর্ভুক্ত নির্দিষ্ট করে x/*y

যাইহোক, যদি ব্যাকস্ল্যাশগুলি ফাইলের মধ্যে ঘটে তবে এগুলিকে অক্ষর নয়, সাধারণ পাঠ্য অক্ষর হিসাবে বিবেচনা করা হয়। সি এর স্ট্রিং ধ্রুবকগুলির জন্য উপযুক্ত চরিত্রের পালানোর ক্রমগুলির কোনওটিই প্রক্রিয়াজাত হয় না। সুতরাং, #include "x\n\\y"তিনটি ব্যাকস্ল্যাশযুক্ত ফাইলের নাম নির্দিষ্ট করে। (কিছু সিস্টেম '\' কে একটি ‘/’পথের নাম পৃথক হিসাবে ব্যাখ্যা করে these এগুলি সমস্ত একইভাবে ব্যাখ্যা করে only এটি কেবলমাত্র ব্যবহারের জন্য সর্বাধিক বহনযোগ্য ‘/’))

ফাইলের নামের পরে লাইনে কিছু আছে (মন্তব্য ব্যতীত) তবে এটি ত্রুটি।


46

এটা করে:

"mypath/myfile" is short for ./mypath/myfile

সঙ্গে .পারেন যেখানে ফাইলের ডিরেক্টরি হচ্ছে #includeমধ্যে অন্তর্ভুক্ত করা হয়, এবং / অথবা কম্পাইলার সাম্প্রতিক কাজ করা, এবং / অথবাdefault_include_paths

এবং

<mypath/myfile> is short for <defaultincludepaths>/mypath/myfile

যদি ./থাকে <default_include_paths>তবে তা কোনও তফাত্ করে না।

যদি mypath/myfileঅন্য অন্তর্ভুক্ত ডিরেক্টরিতে থাকে তবে আচরণটি সংজ্ঞায়িত।


12
না, #include "mypath/myfile"সমান নয় #include "./mypath/myfile"। পাইকুকির উত্তর যেমন বলেছে, ডাবল উক্তি সংকলককে একটি বাস্তবায়ন-সংজ্ঞায়িত পদ্ধতিতে অনুসন্ধান করতে বলে - যার জন্য নির্দিষ্ট জায়গাগুলি অনুসন্ধান করা অন্তর্ভুক্ত #include <...>। (আসলে, এটি সম্ভবত সমতুল্য, তবে কেবল কারণ, উদাহরণস্বরূপ - কমপক্ষে ইউনিক্সের মতো সিস্টেমে /usr/include/mypath/myfileহিসাবে উল্লেখ করা যেতে পারে /usr/include/./mypath/myfile))
কিথ থম্পসন

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

1
-L dirpath বিকল্পটি এরপরে dirpath যুক্ত করে defaultincludepaths, এর অর্থ .(উপরে বর্ণিত হিসাবে) এর অন্য অর্থ দেওয়ার বিপরীতে । এর প্রত্যাশিত পরিণতি #include "..."এবং উভয়ই দিরপাথে#include <...> অনুসন্ধান করে
প্রোটংগন

1
আমি মনে করি এই উত্তরটি ভুল, যেহেতু এটি সূচিত করে যে ডাবল কোট সহ অন্তর্ভুক্ত শিরোনামগুলি সর্বদা বর্তমান কার্যক্ষম ডিরেক্টরিতে সন্ধান করা হয়। অনুসন্ধান পদ্ধতিটি আরও বিশদভাবে; এই উত্তরটি অসম্পূর্ণ। আমি এই মন্তব্যটি অভিযোগ বা হাহাকার করার জন্য যোগ করছি না, তবে কারণ আমি কেন এই উত্তরটি নীচে ভোট দিয়েছি তা বোঝাতে সিস্টেম আমাকে একটি মন্তব্য যুক্ত করতে বলে।
কার্লো উড

39

<file>অন্তর্ভুক্ত অনুসন্ধান করার জন্য প্রাক প্রসেসর বলে -Iডিরেক্টরি এবং পূর্বনির্ধারিত ডিরেক্টরিগুলি থেকে প্রথম , তারপর গ ফাইল এর ডিরেক্টরির মধ্যে। "file"অন্তর্ভুক্ত সোর্স ফাইল এর তালিকা অনুসন্ধান করতে প্রাক প্রসেসর বলে প্রথম , এবং তারপর প্রত্যাবর্তন -Iএবং পূর্বনির্ধারিত। সমস্ত গন্তব্য যে কোনওভাবেই অনুসন্ধান করা হয়, কেবল অনুসন্ধানের ক্রমটি আলাদা।

২০১১ স্ট্যান্ডার্ডটি মূলত "১ 16.২ উত্স ফাইল অন্তর্ভুক্তি" -এ অন্তর্ভুক্ত ফাইলগুলি নিয়ে আলোচনা করে।

2 ফর্ম একটি প্রাক নির্দেশিকা

# include <h-char-sequence> new-line

<এবং> ডিলিমিটারগুলির মধ্যে নির্দিষ্ট অনুক্রমের দ্বারা অনন্যভাবে চিহ্নিত শিরোনামের জন্য বাস্তবায়ন-সংজ্ঞায়িত জায়গাগুলির ক্রম সন্ধান করে এবং শিরোনামের পুরো বিষয়বস্তু দ্বারা সেই নির্দেশকে প্রতিস্থাপনের কারণ ঘটায়। স্থানগুলি কীভাবে নির্দিষ্ট করা হয় বা শিরোনাম সনাক্ত করা হয় তা প্রয়োগ-সংজ্ঞায়িত।

3 ফর্ম একটি প্রাক নির্দেশিকা

# include "q-char-sequence" new-line

"বিসীমাবিদদের মধ্যে নির্দিষ্ট ক্রম দ্বারা চিহ্নিত উত্স ফাইলের সম্পূর্ণ বিষয়বস্তু দ্বারা সেই নির্দেশকে প্রতিস্থাপনের কারণ হিসাবে চিহ্নিত করা হয় named নামকরণ উত্স ফাইলটি একটি বাস্তবায়ন-সংজ্ঞায়িত পদ্ধতিতে অনুসন্ধান করা হয় this যদি এই অনুসন্ধানটি সমর্থন না করা হয়, বা যদি অনুসন্ধান ব্যর্থ হয় , নির্দেশটি পুনরায় প্রসেস করা হয় যেন এটি পড়ে read

# include <h-char-sequence> new-line

মূল নির্দেশ থেকে অভিন্ন সমন্বিত ক্রম (>> অক্ষর সহ, যদি থাকে) থাকে

নোট করুন যে ফাইলটি খুঁজে পাওয়া না গেলে ফর্মটি "xxx"ফর্মের অবনতি হয় <xxx>। বাকিটি বাস্তবায়ন-সংজ্ঞায়িত।


4
আপনি কি সি স্ট্যান্ডার্ডে এই -Iব্যবসাটি নির্দিষ্ট করা হয়েছে তার একটি রেফারেন্স সরবরাহ করতে পারেন ?
juanchopanza

1
আমি কোন রেফারেন্স দেখতে পাচ্ছি -I
janchopanza

2
এটি "বাস্তবায়ন-সংজ্ঞায়িত" অংশ।

27

#include <file.h>সংকলকটিকে তার "অন্তর্ভুক্ত" ডিরেক্টরিতে শিরোনামটি অনুসন্ধান করতে বলে, যেমন: MinGW এর জন্য সংকলক সিটিতে অনুসন্ধান করবে file.h: \ MinGW \ অন্তর্ভুক্ত wherever বা যেখানেই আপনার সংকলক ইনস্টল করা আছে।

#include "file"কম্পাইলারকে বর্তমান ডিরেক্টরিটি (অর্থাত্ ডিরেক্টরিটি যেখানে উত্স ফাইলটি থাকে) অনুসন্ধান করতে বলে file

আপনি -Iএটি জিসিসির জন্য পতাকাটি ব্যবহার করতে পারেন যে এটি যখন কোণযুক্ত বন্ধনীগুলির সাথে অন্তর্ভুক্ত হয় তখন এটি পরে ডিরেক্টরিতে শিরোনামগুলি অনুসন্ধান করা উচিত -I। জিসিসি পতাকাটির পরে ডিরেক্টরিটিকে ডিরেক্টরি বলে মনে করবে includes

উদাহরণস্বরূপ, যদি myheader.hআপনার নিজের ডিরেক্টরিতে কোনও ফাইল কল করা #include <myheader.h>থাকে তবে আপনি পতাকাটি দিয়ে জিসিসি কল করলে আপনি বলতে পারেন -I .(এটি নির্দেশ করে যে এটি বর্তমান ডিরেক্টরিতে অন্তর্ভুক্ত রয়েছে))

-Iপতাকা ছাড়াই আপনাকে #include "myheader.h"ফাইলটি অন্তর্ভুক্ত করতে বা আপনার সংকলকটির ডিরেক্টরিতে যেতে myheader.hহবে include


22

মান অনুসারে - হ্যাঁ, তারা পৃথক:

  • ফর্মটির একটি পূর্বনির্ধারিত নির্দেশিকা

    #include <h-char-sequence> new-line

    শিরোনাম <এবং >ডিলিমিটারগুলির মধ্যে নির্দিষ্ট ক্রম দ্বারা স্বতন্ত্রভাবে চিহ্নিত শিরোনামের জন্য বাস্তবায়ন-সংজ্ঞায়িত জায়গাগুলির ক্রম সন্ধান করে এবং শিরোনামের পুরো বিষয়বস্তু দ্বারা সেই নির্দেশকে প্রতিস্থাপনের কারণ ঘটায়। স্থানগুলি কীভাবে নির্দিষ্ট করা হয় বা শিরোনাম সনাক্ত করা হয় তা প্রয়োগ-সংজ্ঞায়িত।

  • ফর্মটির একটি পূর্বনির্ধারিত নির্দেশিকা

    #include "q-char-sequence" new-line

    "ডিলিমিটারগুলির মধ্যে নির্দিষ্ট ক্রম দ্বারা চিহ্নিত উত্স ফাইলের সম্পূর্ণ বিষয়বস্তু দ্বারা সেই নির্দেশকে প্রতিস্থাপনের কারণ ঘটায় । নামকরণ করা উত্স ফাইলটি একটি প্রয়োগ-সংজ্ঞায়িত পদ্ধতিতে অনুসন্ধান করা হয়। যদি এই অনুসন্ধানটি সমর্থিত না হয়, বা অনুসন্ধান ব্যর্থ হয় তবে নির্দেশটি পুনরায় প্রসেস করা হয় যেন এটি পড়ে

    #include <h-char-sequence> new-line

    >মূল নির্দেশ থেকে একই রকম ক্রম ( অক্ষর সহ , যদি থাকে) সহ

  • ফর্মটির একটি পূর্বনির্ধারিত নির্দেশিকা

    #include pp-tokens new-line

    (এটি আগের দুটি ফর্মের একটির সাথে মেলে না) অনুমোদিত। includeনির্দেশের পরে প্রিপ্রোসেসিং টোকেনগুলি সাধারণ পাঠ্যের মতোই প্রক্রিয়া করা হয়। (বর্তমানে ম্যাক্রোর নাম হিসাবে সংজ্ঞায়িত প্রতিটি শনাক্তকারী তার প্রস্রোসেসিং টোকেনগুলির প্রতিস্থাপনের তালিকার দ্বারা প্রতিস্থাপিত হয়)) সমস্ত প্রতিস্থাপনের পরে প্রাপ্ত নির্দেশাবলী পূর্ববর্তী দুটি ফর্মের মধ্যে একটির সাথে মেলে। একটি <এবং একটি >প্রিপ্রসেসিং টোকেন জোড় বা "অক্ষরের একটি জুটির মধ্যে প্রোক্রোসিং টোকেনগুলির ক্রমটি একটি একক শিরোনাম নামের প্রিপ্রোসেসিং টোকেনের সাথে সংযুক্ত করে প্রয়োগকরণ-সংজ্ঞায়িত।

সজ্ঞা:

  • এইচ-চর: নতুন লাইন চরিত্র এবং বাদে উত্স চরিত্রের যে কোনও সদস্য সেট করুন >

  • কিউ-চর: নতুন লাইন চরিত্র এবং বাদে উত্স চরিত্রের যে কোনও সদস্য সেট করুন "

নোট করুন যে মান বাস্তবায়ন-সংজ্ঞায়িত শিষ্টাচারগুলির মধ্যে কোনও সম্পর্ককে বলে না। প্রথম রূপটি একটি বাস্তবায়ন-সংজ্ঞায়িত উপায়ে অনুসন্ধান করে এবং অন্যটি (সম্ভবত অন্য) বাস্তবায়ন-সংজ্ঞায়িত উপায়ে অনুসন্ধান করে। মানকটি নির্দিষ্ট করে যে কিছু অন্তর্ভুক্ত ফাইল উপস্থিত থাকতে হবে (উদাহরণস্বরূপ, <stdio.h>)।

সাধারণত আপনার কম্পাইলারটির জন্য আপনাকে ম্যানুয়ালটি পড়তে হবে, তবে সাধারণত (traditionতিহ্য অনুসারে) #include "..."ফর্মটি #includeপ্রথমে যে ফাইলটি খুঁজে পাওয়া যায় তার ডিরেক্টরি #include <...>অনুসন্ধান করে এবং তারপরে যে ফর্মগুলি অনুসন্ধান করে (যে পথটি অন্তর্ভুক্ত করে, উদাহরণস্বরূপ সিস্টেম শিরোনাম) )।


2
এটি প্রায় সাত বছর আগে থেকে পাইকুকির জবাব হিসাবে ঠিক একই পাঠ্য ।
কাইল স্ট্র্যান্ড

5
@ কাইলস্ট্র্যান্ড কারণ এটি একই পাঠ্যটি প্রমিতের প্রাসঙ্গিক বিভাগের একটি উদ্ধৃতি - সেই পাঠ্যটি অভিন্ন হওয়া উচিত । আসল উত্তরটি একই পাঠ্য নয় এবং কিছুটা আলাদা while যদিও আমি স্বীকৃতিও দিয়েছি যে এটি বাস্তবায়নের জন্য ডকুমেন্টেশনে লিখিত হবে আমি এটিও নোট করি যে এটিগুলির একটি ব্যাখ্যা করার মতো একটি traditionalতিহ্যবাহী উপায়ও রয়েছে (যেটি বেশিরভাগ বা সমস্ত সংকলক আমি শ্রদ্ধার সাথে ব্যবহার করেছি) ।
28:25

2
আইএমও এটি এখানে সেরা উত্তর, কারণ এটি স্ট্যান্ডার্ড কী বলে এবং বেশিরভাগ সংকলকরা আসলে কী করে তা উভয়ই জুড়ে।
প্লাগওয়াশ

17

দুর্দান্ত উত্তরের জন্য ধন্যবাদ, esp। অ্যাডাম স্টেলমাস্কিজিক এবং পাইকুকি, এবং আইব।

অনেক প্রোগ্রামারদের মতো, আমি "myApp.hpp"অ্যাপ্লিকেশন নির্দিষ্ট ফাইলগুলির <libHeader.hpp>জন্য ফর্মটি এবং গ্রন্থাগার এবং সংকলক সিস্টেম ফাইলগুলির জন্য ফর্ম, যেমন নির্দিষ্ট করা ফাইল /Iএবং INCLUDEপরিবেশের ভেরিয়েবলের জন্য আদর্শ ব্যবহার করে বছরের পর বছর ধরে ব্যবহার করেছি।

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

#include "../../MyProgDir/SourceDir1/someFile.hpp"

এমএসভিএসের পুরানো সংস্করণগুলিতে ডাবল ব্যাকস্ল্যাশগুলি (\\) প্রয়োজন, তবে এখন এটি প্রয়োজন হয় না। জানি না কখন বদলেছে। 'নিক্সের সাথে সামঞ্জস্যের জন্য কেবল ফরওয়ার্ড স্ল্যাশ ব্যবহার করুন (উইন্ডোজ এটি স্বীকার করবে)।

আপনি যদি সত্যিই এটি সম্পর্কে উদ্বিগ্ন "./myHeader.h"হন তবে উত্স কোড হিসাবে একই ডিরেক্টরিতে অন্তর্ভুক্ত ফাইলের জন্য ব্যবহার করুন (আমার বর্তমান, খুব বড় প্রকল্পে কিছু নকল রয়েছে যার মধ্যে ফাইলের নাম ছড়িয়ে আছে - সত্যই একটি কনফিগারেশন পরিচালনার সমস্যা)।

এখানে দুটিই MSDN ব্যাখ্যা আপনাদের সুবিধার জন্য এখানে অনুলিপি করেছে)।

উদ্ধৃত ফর্ম

প্রিপ্রসেসর অনুসন্ধানগুলি এই ক্রমে ফাইলগুলি অন্তর্ভুক্ত করে:

  1. ফাইল হিসাবে একই ডিরেক্টরিতে # অন্তর্ভুক্ত বিবৃতি রয়েছে।
  2. বর্তমানে খোলার ডিরেক্টরিগুলিতে ফাইলগুলি অন্তর্ভুক্ত করা হয়েছে, বিপরীত ক্রমে যা
    সেগুলি খোলা হয়েছিল। অনুসন্ধান পিতামাতার ডিরেক্টরিতে ফাইলের অন্তর্ভুক্ত হয় এবং
    কোনও পিতামহ অন্তর্ভুক্ত ফাইলগুলির ডিরেক্টরিগুলির মাধ্যমে উপরের দিকে অবিরত থাকে।
  3. প্রতিটি /Iসংকলক বিকল্প দ্বারা নির্দিষ্ট করা সেই পথ ধরে ।
  4. INCLUDEপরিবেশের পরিবর্তনশীল দ্বারা নির্দিষ্ট করা পথগুলি বরাবর ।

কোণ-বন্ধনী ফর্ম

প্রিপ্রসেসর অনুসন্ধানগুলি এই ক্রমে ফাইলগুলি অন্তর্ভুক্ত করে:

  1. প্রতিটি /Iসংকলক বিকল্প দ্বারা নির্দিষ্ট করা সেই পথ ধরে ।
  2. কমান্ড লাইনে সংকলন ঘটে যখন INCLUDEপরিবেশের ভেরিয়েবল দ্বারা নির্দিষ্ট করা পথগুলি বরাবর ।

16

কমপক্ষে জিসিসি সংস্করণ <= 3.0 এর জন্য, কোণ-বন্ধনী ফর্ম অন্তর্ভুক্ত ফাইল এবং এর মধ্যে একটির মধ্যে নির্ভরতা তৈরি করে না।

সুতরাং যদি আপনি নির্ভরতা বিধি তৈরি করতে চান (উদাহরণের জন্য জিসিসি-এম বিকল্পটি ব্যবহার করে), আপনাকে অবশ্যই নির্ভরযোগ্যতা গাছের অন্তর্ভুক্ত থাকা ফাইলগুলির জন্য উদ্ধৃত ফর্মটি ব্যবহার করতে হবে।

( Http://gcc.gnu.org/onlinesocs/cpp/Invocation.html দেখুন )


1
হ্যাঁ - নির্ভরতা উত্পন্ন করার বিভিন্ন উপায় রয়েছে। এটি তাদের মধ্যে একটি তবে এটি একমাত্র নয়।
প্রাইফটান

15

জন্য #include ""একটি কম্পাইলার স্বাভাবিকভাবে ফাইল যা রয়েছে সেটা অন্তর্ভুক্ত এবং তারপর অন্যান্য ফোল্ডার ফোল্ডার অনুসন্ধান করে। জন্য #include <>কম্পাইলার বর্তমান ফাইলের ফোল্ডারের অনুসন্ধান করে না।


1
লোকেরা কেন অসমত তা নিশ্চিত নয়।
ম্যাক্সিম এগারুশকিন

আমি সন্দেহ করি কারণ বেশিরভাগ লোকেরা কেবল তাদের সিডাব্লুডিতে ফাইলগুলি সংকলন করে। আপনি যদি ডিরেক্টরি foo এ থাকেন এবং আপনি foo / ইউনিটেষ্ট / বার.c কম্পাইল করে থাকেন এবং এতে বার্ড হ'ল অন্তর্ভুক্ত থাকে, তারপরে "বার। H" কাজ করে এবং <বার।

1
@ ম্যাক্সিমের লোকেরা দ্বিমত পোষণ করছেন কারণ আপনি যে আচরণটি বর্ণনা করেছেন সেটি স্ট্যান্ডার্ড সি নয়
ওসভেইন

2
@ স্পুকবাস্টার রাইট, স্ট্যান্ডার্ডটি উভয়ই বলেছে <filename>এবং "filename"বাস্তবায়ন-সংজ্ঞায়িত জায়গাগুলি অনুসন্ধান করে।
ম্যাক্সিম এগারুশকিন

14

আপনি যখন # অন্তর্ভুক্ত <ফাইল ফাইল> ব্যবহার করেন, প্রাক-প্রসেসর সি \ সি ++ শিরোনাম ফাইলগুলির ডিরেক্টরিতে (stdio.h \ cstdio, স্ট্রিং, ভেক্টর ইত্যাদি) ফাইল সন্ধান করে। তবে, আপনি যখন # অন্তর্ভুক্ত "ফাইলের নাম" ব্যবহার করেন: প্রথমে, প্রি-প্রসেসর বর্তমান ডিরেক্টরিতে ফাইলটি সন্ধান করে এবং যদি এটি এখানে না থাকে - তিনি সি \ সি ++ হেডার ফাইলগুলির ডিরেক্টরিতে এটি সন্ধান করছেন।


1
বছরের পর বছর ধরে একটি নিখুঁত উত্তর পাওয়ার পরে, কেন একটি উত্তর জমা দিন, এটি কেবল স্পষ্টতই ভুল? যদিও সাধারণ, #includeনির্দেশিকা মোটেই ফাইলের সাথে কঠোরভাবে সম্পর্কিত নয়।
IInspectable

@Inspectable দয়া করে ব্যাখ্যা করুন কেন এটি কোনও ফাইলের সাথে সম্পর্কিত নয়।
বেহরোজ কারজু

11

অ্যাঙ্গেল বন্ধনী সহ একটি # অন্তর্ভুক্তি ফাইলটি অন্তর্ভুক্ত করার জন্য একটি "প্রয়োগের উপর নির্ভরশীল জায়গাগুলি তালিকা" অনুসন্ধান করবে (যা "সিস্টেমের শিরোনাম" বলার একটি অত্যন্ত জটিল উপায়)।

উদ্ধৃতি সহ একটি # অন্তর্ভুক্ত কেবল একটি ফাইল অনুসন্ধান করবে (এবং, "বাস্তবায়ন-নির্ভর পদ্ধতিতে", ব্লিহ)। যার অর্থ, সাধারণ ইংরেজিতে, আপনি যে টথটি টস করেছেন তাতে / ফাইল নামটি প্রয়োগ করার চেষ্টা করবে এবং কোনও সিস্টেমের পথ তৈরি করবে না বা অন্যথায় এটির সাথে ছলছল করবে না।

এছাড়াও, যদি # অন্তর্ভুক্ত "" ব্যর্থ হয় তবে এটি স্ট্যান্ডার্ড অনুসারে # অন্তর্ভুক্ত <> হিসাবে পুনরায় পড়তে হবে।

জিসিসি ডকুমেন্টেশন একটি (কম্পাইলার নির্দিষ্ট) বর্ণনা যা যদিও জিসিসি নির্দিষ্ট এবং মান হচ্ছে, আইএসও মান অ্যাটর্নি-শৈলী আলাপ চেয়ে বুঝতে অনেক সহজ আছে।


যাইহোক, অ্যাঙ্গেল ব্র্যাকেট বা উদ্ধৃতি ব্যবহার করে ফাইলগুলি যেভাবে অন্তর্ভুক্ত হয় তা প্রভাবিত করে না, এটি হুবহু: প্রিপ্রোসেসর অবশ্যই প্রদানের আগে ফাইলগুলি মূল উত্স ফাইলে অন্তর্ভুক্ত করে কোডটি অনুলিপি করে একটি বড় উত্স ফাইল তৈরি করে giving এটি সংকলকটিতে (প্রিপ্রসেসর অন্যান্য জিনিস যেমন # ডিফাইন টেকসইটিউন, # আইফ মূল্যায়ন ইত্যাদি করে তবে এই প্রক্রিয়াজাতকরণের কাজটি সহজ)
লঘর্ন

দ্বন্দ্ব নিয়ে কী? উদাহরণস্বরূপ বলুন যে আমি zlib.hআমার 'ব্যবহারকারীর' অনুসন্ধানের পাথগুলিতে রয়েছি এবং সিস্টেম অনুসন্ধানের পথে একটি আলাদা সংস্করণ বিদ্যমান, তারপরে কি #include <zlib.h>সিস্টেম সংস্করণটি অন্তর্ভুক্ত করা যায় এবং #include "zlib.h"আমার নিজেরটি অন্তর্ভুক্ত থাকে?
the_mandrill

: আহা, আমার নিজের প্রশ্নের উত্তর stackoverflow.com/questions/21593/...
the_mandrill

স্ট্যান্ডার্ড (গুলি) এবং সাধারণ বাস্তবায়ন কনভেনশন উভয়ই এখানে প্রাসঙ্গিক বলে স্বীকার করার জন্য আপনাকে ধন্যবাদ ।
কাইল স্ট্র্যান্ড

10
#include "filename" // User defined header
#include <filename> // Standard library header.

উদাহরণ:

ফাইলের নাম এখানে Seller.h:

#ifndef SELLER_H     // Header guard
#define SELLER_H     // Header guard

#include <string>
#include <iostream>
#include <iomanip>

class Seller
{
    private:
        char name[31];
        double sales_total;

    public:
        Seller();
        Seller(char[], double);
        char*getName();

#endif

শ্রেণি প্রয়োগের ক্ষেত্রে (উদাহরণস্বরূপ, Seller.cppএবং অন্যান্য ফাইলগুলিতে ফাইলটি ব্যবহৃত হবে Seller.h), ব্যবহারকারী দ্বারা সংজ্ঞায়িত শিরোনামটি এখন অন্তর্ভুক্ত করা উচিত:

#include "Seller.h"

10
  • #include <> পূর্বনির্ধারিত শিরোলেখ ফাইলগুলির জন্য

যদি হেডার ফাইলটি পূর্বনির্ধারিত থাকে তবে আপনি কেবল কৌনিক বন্ধনীগুলিতে শিরোনাম ফাইলের নাম লিখতে পারেন এবং এটি দেখতে এটির মতো হবে (ধরে নেওয়া আমাদের একটি পূর্বনির্ধারিত শিরোনাম ফাইলের নাম আইওস্ট্রিম রয়েছে):

#include <iostream>
  • #include " " প্রোগ্রামার সংজ্ঞায়িত করে শিরোনাম ফাইলগুলির জন্য

আপনি যদি (প্রোগ্রামার) নিজের শিরোনামের ফাইলটি লিখে থাকেন তবে আপনি শিরোনামের ফাইলের নাম উদ্ধৃতিতে লিখবেন। সুতরাং, ধরুন যে আপনি একটি শিরোনামযুক্ত ফাইলটি লিখেছেন myfile.hতবে এটি এই ফাইলটি অন্তর্ভুক্ত করার জন্য আপনি কীভাবে অন্তর্ভুক্ত নির্দেশিকাটি ব্যবহার করবেন তার একটি উদাহরণ:

#include "myfile.h"

2
এর প্রাক-সংজ্ঞায়িত শিরোলেখ ফাইলগুলির সাথে কিছুই করার নেই। এটি অনুসন্ধানের জন্য অবস্থানগুলির সাথে করতে হবে।
সি জনসন

9

এখানে উত্তরগুলির মধ্যে অনেকগুলি ফাইল সন্ধানের জন্য সংকলকটি যে পাথগুলিতে অনুসন্ধান করবে সেগুলিকে কেন্দ্র করে। যদিও বেশিরভাগ সংকলক এটি করেন, একটি মাননীয় সংকলককে স্ট্যান্ডার্ড শিরোনামের প্রভাবগুলির সাথে প্রিপ্রোগ্র্যাম করার অনুমতি দেওয়া হয়, এবং চিকিত্সা করার জন্য,#include <list> একটি সুইচ হিসাবে , এবং এটি কোনও ফাইল হিসাবে উপস্থিত থাকার প্রয়োজন নেই।

এটি নিখুঁত অনুমানমূলক নয়। কমপক্ষে একটি সংকলক রয়েছে যা সেভাবে কাজ করে। #include <xxx>কেবলমাত্র মানক শিরোনাম সহ ব্যবহার করার পরামর্শ দেওয়া হয়।


9
#include <abc.h>

স্ট্যান্ডার্ড লাইব্রেরি ফাইল অন্তর্ভুক্ত করতে ব্যবহৃত হয়। সুতরাং সংকলকটি যেখানে স্ট্যান্ডার্ড লাইব্রেরির শিরোনামগুলি অবস্থান করছে তা পরীক্ষা করবে।

#include "xyz.h"

সংকলকটিকে ব্যবহারকারী-সংজ্ঞায়িত শিরোলেখ ফাইলগুলি অন্তর্ভুক্ত করতে বলবে। সুতরাং সংকলক বর্তমান ফোল্ডার বা -Iসংজ্ঞায়িত ফোল্ডারে এই শিরোলেখ ফাইলগুলির জন্য পরীক্ষা করবে will


7

সি ++ এ দুটি উপায়ে একটি ফাইল অন্তর্ভুক্ত করুন:

প্রথমটি হল # অন্তর্ভুক্ত যা প্রিপ্রসেসরটিকে পূর্বনির্ধারিত ডিফল্ট অবস্থানে ফাইলটি সন্ধান করতে বলে। এই অবস্থানটি প্রায়শই একটি অন্তর্ভুক্ত পরিবেশের পরিবর্তনশীল যা ফাইলগুলি অন্তর্ভুক্ত করার পথটিকে বোঝায়।

এবং দ্বিতীয় ধরণটি হল # অন্তর্ভুক্ত "ফাইলের নাম" যা প্রিপ্রসেসরটিকে বর্তমান ডিরেক্টরিতে ফাইলটি সন্ধান করতে বলছে, তারপরে ব্যবহারকারীরা সেট আপ করা পূর্বনির্ধারিত অবস্থানগুলিতে এটি সন্ধান করুন।


7

ফর্ম 1 - # অন্তর্ভুক্ত <xxx>

প্রথমে, বর্তমান ডিরেক্টরিতে হেডার ফাইলের উপস্থিতি সন্ধান করা হয় সেখান থেকে নির্দেশনা চাওয়া হয়েছে। যদি এটি না পাওয়া যায় তবে এটি স্ট্যান্ডার্ড সিস্টেম ডিরেক্টরিগুলির পূর্বনির্ধারিত তালিকায় অনুসন্ধান করে।

ফর্ম 2 - # "এক্সএক্সএক্সএক্স" অন্তর্ভুক্ত করুন

এটি বর্তমান ডিরেক্টরিতে শিরোলেখ ফাইলটির উপস্থিতি সন্ধান করে যেখান থেকে নির্দেশনা চাওয়া হয়।


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

আপনি - I dir ব্যবহার করে অনুসন্ধানের পথে অতিরিক্ত ডিরেক্টরি যুক্ত করতে পারেন , যার ফলে বর্তমান ডিরেক্টরিটি (নির্দেশকের উদ্ধৃতি ফর্মের জন্য) এবং মানক ডিরেক্টরি ডিরেক্টরিগুলির আগে ডিয়ার অনুসন্ধান করা হবে।


মূলত, "xxx" ফর্মটি বর্তমান ডিরেক্টরিতে অনুসন্ধান ছাড়া কিছুই নয়; যদি ফর্মটি পড়ে না পাওয়া যায়


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

1
@ জোনাথন লেফলার আপনি কি আমাকে "সুপ্রতিষ্ঠিত" উত্তরের দিকে ইঙ্গিত করতে পারেন যা আপনি দর্শনের উত্তরের মতোই সংক্ষিপ্ত এবং নির্ভুল বলে মনে করছেন?
ব্যক্তিগত_ক্লাউড

1
#include "header.h"ফর্মের বিবরণটি নির্ভুল নয়, @ ব্যক্তিগত / ক্লাউড। আমি পাইকুকি এবং ইয়ান ড্রোনউডের উত্তরটিকে সবচেয়ে প্রাসঙ্গিক বলে বিবেচনা করি কারণ তারা তাদের তথ্যটি কোথা থেকে আসে তা সনাক্ত করে। আমি পুরোপুরি সন্তোষজনক হওয়ার মতো শীর্ষে-পোষ্ট করা উত্তর খুঁজে পাই না।
জোনাথন লেফলার

এই উত্তরটি কেন উপরে দেখানো হয়েছে, যখন আরও দুটি উত্তর আরও নীচে 650০+ ভোট পেয়েছে? এই উত্তরটি আমাকে বিভ্রান্ত করেছে, কারণ এটি আমার দ্বারা অনুসরণ করা আচরণের সাথে মেলে না। এটি হতে পারে, কারণ কোণ বন্ধনী থেকে বেরিয়ে আসার কারণে শেষ বাক্যটি নষ্ট হয়ে গেছে। আমি এটির অর্থ কী বোঝাতে চাইছে তা নিশ্চিত নই।
নিওনিত

6

#include <filename>যখন একটি সিস্টেম ফাইল উল্লেখ করা হচ্ছে ব্যবহার করা হয়। এটি একটি শিরোনাম ফাইল যা সিস্টেমের ডিফল্ট লোকেশনগুলিতে /usr/includeবা এর মতো পাওয়া যায় /usr/local/include। আপনার নিজস্ব ফাইলগুলির জন্য যা আপনাকে অন্য একটি প্রোগ্রামে অন্তর্ভুক্ত করতে হবে আপনাকে #include "filename"সিনট্যাক্সটি ব্যবহার করতে হবে ।


6

"<ফাইলের নাম>" স্ট্যান্ডার্ড সি লাইব্রেরির অবস্থানগুলিতে অনুসন্ধান করে

যদিও "ফাইলের নাম" বর্তমান ডিরেক্টরিতে অনুসন্ধান করে।

আদর্শভাবে, আপনি স্ট্যান্ডার্ড সি লাইব্রেরির জন্য <...> এবং আপনি যে লাইব্রেরিগুলি লিখেছেন এবং বর্তমান ডিরেক্টরিতে উপস্থিত রয়েছে তার জন্য "..." ব্যবহার করবেন।


4
কোন নতুন তথ্য এই উত্তরটি অন্যদের সাথে যুক্ত করে?
ড্যানিয়েল ল্যাঙ্গার

5

সহজ সাধারণ নিয়মটি হ'ল সংকলকটির সাথে আসা শিরোনাম ফাইলগুলি অন্তর্ভুক্ত করতে কোণযুক্ত বন্ধনী ব্যবহার করা। অন্য কোনও হেডার ফাইল অন্তর্ভুক্ত করতে ডাবল উদ্ধৃতি ব্যবহার করুন। বেশিরভাগ সংকলক এটি এইভাবে করেন।

1.9 - শিরোনাম ফাইলগুলি প্রাক প্রসেসরের নির্দেশাবলী সম্পর্কে আরও বিশদে ব্যাখ্যা করে। আপনি যদি কোনও শিক্ষানবিস প্রোগ্রামার হন তবে সেই পৃষ্ঠাটি আপনাকে সমস্ত কিছু বুঝতে সহায়তা করবে। আমি এখান থেকে শিখেছি, এবং আমি এটি কাজ করে চলেছি।


4
#include <filename>

আপনি যখন সি / সি ++ সিস্টেম বা সংকলক লাইব্রেরির হেডার ফাইলটি ব্যবহার করতে চান তখন ব্যবহৃত হয়। এই লাইব্রেরিগুলি stdio.h, string.h, math.h ইত্যাদি হতে পারে can

#include "path-to-file/filename"

আপনি যখন নিজের প্রকল্পের ফোল্ডারে বা অন্য কোথাও থাকা আপনার নিজস্ব কাস্টম শিরোনাম ফাইলটি ব্যবহার করতে চান তখন ব্যবহৃত হয়।

প্রিপ্রোসেসর এবং হেডার সম্পর্কে আরও তথ্যের জন্য For সি পড়ুন - প্রাক প্রসেসরগুলি


3

#include <filename>

  • প্রিপ্রোসেসর বাস্তবায়ন-নির্ভর পদ্ধতিতে অনুসন্ধান করে। এটি সংস্থাপককে ডিরেক্টরি অনুসন্ধান করতে বলে যেখানে সিস্টেম শিরোলেখের ফাইলগুলি রাখা হয়।
  • এই পদ্ধতিটি সাধারণত স্ট্যান্ডার্ড শিরোনাম ফাইলগুলি অনুসন্ধান করতে ব্যবহার করে।

#include "filename"

  • এটি শিরোনাম ফাইলগুলি যেখানে প্রোগ্রাম চলছে সেখানে অনুসন্ধান করতে সংকলককে বলুন। যদি এটি ব্যর্থ হয় তবে এটির মতো আচরণ করে#include <filename> এবং সেই শিরোলেখ ফাইলটি সন্ধান করুন যেখানে সিস্টেম শিরোনাম ফাইলগুলি সঞ্চয় করে।
  • এই পদ্ধতিটি সাধারণত ব্যবহারকারী সংজ্ঞায়িত শিরোলেখ ফাইলগুলি (ব্যবহারকারী দ্বারা তৈরি হওয়া শিরোনাম ফাইলগুলি) সনাক্ত করতে ব্যবহৃত হয়। আপনি যদি স্ট্যান্ডার্ড লাইব্রেরি কল করতে চান তবে এটি ব্যবহার করবেন না কারণ এটির চেয়ে আরও বেশি সংকলন সময় লাগে #include <filename>

2

বর্তমান কনফিগারেশনের উপর ভিত্তি করে gcc ব্যবহার করে আপনার সিস্টেমে অনুসন্ধানের আদেশটি দেখতে, আপনি নিম্নলিখিত কমান্ডটি কার্যকর করতে পারেন। আপনি এখানে এই আদেশটি সম্পর্কে আরও বিস্তারিত জানতে পারেন

cpp -v /dev/null -o /dev/null

অ্যাপল এলএলভিএম সংস্করণ 10.0.0 (ঝনঝন -100.10.44.2)
লক্ষ্য: x86_64-আপেল-ডারউইন 18.0.0
থ্রেড মডেল: পিক্স ইনস্টলডির : গ্রন্থাগার / বিকাশকারী / কমান্ডলাইনটুলস / ইউএসআর / বিন
"/ লাইব্রেরি / ডেভেলপার / কমান্ডলাইনটুলস / ইউএসআর / বিন / ঝনঝন" -সিসি 1-ট্রিপল x86_64-আপেল-ম্যাকোসেক্স 10.14.0 -পরিচালিত-অবজেক্ট-ইসা-ব্যবহার -Werror = অবমূল্যায়ন-অবজেক্ট-ইসা-ব্যবহার -E-ডিসাইজেবল-মুক্ত - অক্ষম-এলএলভিএম-যাচাইকারী-ডিস্কার্ড-মান-নাম -মাইন-ফাইল-নাম নাল -মিল্রোকেশন-মডেল পিক-পিক-স্তর 2 -মথ্রেড-মডেল পিক্সিক -মিডিসেবল-এফপি-এলিমি -ফ্নো-কড়া-রিটার্ন-ম্যাসম-ক্রোবজ - মুনউইন্ড-টেবিলগুলি -তারেটেজ-সিপিইউ পেনারিন -ডওয়ার্ফ-কলাম-তথ্য -ডিবুগার-টিউনিং = এলডিবি-টার্গেট-লিংক-সংস্করণ 409.12 -ভি-রিসোর্স-ডির / লাইব্রেরি / ডেভেলপার / কম্যান্ডলাইনটুলস / এসআর / লিবি / ক্লাং ১০০.০.০ - isysroot / লাইব্রেরি / ডেভেলপার / কম্যান্ডলাইনটুলস / এসডিকেস / ম্যাকসএক্স 10.14.sdk -I / usr / স্থানীয় / অন্তর্ভুক্ত -fdebug- সংকলন-ডির / ব্যবহারকারী / হোগ্রস্টম -ফেরার-সীমা 19 -ফামেসেজ দৈর্ঘ্য 80-স্ট্যাক-প্রটেক্টর 1 -ফ্লকস -ফেনকোড-এক্সটেন্ডেড-ব্লক-সিগনেচার -fobjc- রানটাইম = ম্যাকোসেক্স -10.14।0 -fmax-type-align = 16 -fdiagnostics-show-વિકલ્પ -fcolor- ডায়াগনস্টিকস-ট্র্যাডিশনাল-সিপিপি -o - -xc / দেব / নাল
ক্ল্যাং-সিসি সংস্করণ 10.0.0 (ক্ল্যাং -1000.10.44.2) ডিফল্ট লক্ষ্য x86_64-আপেল-ডারউইন 18.0.0 অস্তিত্বহীন ডিরেক্টরি উপেক্ষা "/ লাইব্রেরি / ডেভেলপার / কমন্ডলাইনটুলস / এসডি কে / ম্যাকোএসএক্স 10.14.sdk/usr/local/inc समावेश" অস্তিত্বহীন ডিরেক্টরি "/ লাইব্রেরি / ডেভেলপার / কম্যান্ডলাইনটুলস / এসডিকে / ম্যাকসএক্স ১০.১৪.এসডিকি / লাইব্রেরি / ফ্রেমওয়ার্কস"
# অন্তর্ভুক্ত "..." অনুসন্ধান এখানে শুরু হয়:
# অন্তর্ভুক্ত <...> অনুসন্ধান এখানে শুরু হয়:
/ ইউএসআর / স্থানীয় / অন্তর্ভুক্ত
/ লাইব্রেরি / বিকাশকারী / কমান্ডলাইনটুলস / ইউএসআর / লিবিব / ক্ল্যাং / 10.0.0 / অন্তর্ভুক্ত
/ লাইব্রেরি / বিকাশকারী / কমান্ডলাইনটুলস / ইউএসআর / অন্তর্ভুক্ত / লাইব্রেরি / ডেভেলপার /
কম্যান্ডলাইনটুলস
/ এসডিকে / ম্যাকোএসএক্স 10.14.এসডিকি / ইউএস / অন্তর্ভুক্ত / লাইব্রেরি / বিকাশকারী / কমান্ডলাইনটুলস / এসডিকে / ম্যাকোএসএক্স ১০.১৪.এসডিকি / সিস্টেম / গ্রন্থাগার / ফ্রেমওয়ার্ক (ফ্রেমওয়ার্ক ডিরেক্টরি)
অনুসন্ধান তালিকার সমাপ্তি।


1
#include <file> 

একটি ফাইল অন্তর্ভুক্ত যেখানে ডিফল্ট অন্তর্ভুক্ত ডিরেক্টরি থাকে।

#include "file" 

বর্তমান ডিরেক্টরিতে একটি ফাইল অন্তর্ভুক্ত রয়েছে যেখানে এটি সংকলিত হয়েছিল।


-2

# অন্তর্ভুক্ত বিবৃতি লেখার দুটি উপায় রয়েছে exists এগুলি হ'ল:

#include"filename"
#include<filename>

প্রতিটি রূপের অর্থ

#include"mylib.h"

এই কমান্ডটি mylib.hবর্তমান ডিরেক্টরিতে ফাইলটির পাশাপাশি সুনির্দিষ্ট ডিরেক্টরিগুলির তালিকা হিসাবে নির্ধারিত ডিরেক্টরিগুলির তালিকা অনুসন্ধান করবে যা সেট আপ করা যেতে পারে up

#include<mylib.h>

এই কমান্ডটি mylib.hকেবলমাত্র ডিরেক্টরিগুলির নির্দিষ্ট তালিকার মধ্যে ফাইলটি সন্ধান করবে।

অন্তর্ভুক্ত অনুসন্ধানের পথটি ডিরেক্টরিগুলির একটি তালিকা ছাড়া আর কিছুই নয় যা ফাইল অন্তর্ভুক্ত হওয়ার জন্য অনুসন্ধান করা হবে if বিভিন্ন সি সংকলক আপনাকে অনুসন্ধানের পথটি আলাদাভাবে শিখতে দেয়।


1
যদি আপনি কোনও পুরানো প্রশ্নের উত্তর দেওয়ার সিদ্ধান্ত নিয়ে থাকেন যা ভালভাবে প্রতিষ্ঠিত হয়েছে এবং সঠিক উত্তর দিয়েছে, দিনের শেষ দিকে একটি নতুন উত্তর যুক্ত করা আপনার কোনও creditণ নাও পেতে পারে। আপনার যদি কিছু স্বতন্ত্র নতুন তথ্য থাকে, বা আপনি নিশ্চিত হন যে অন্য উত্তরগুলি সবই ভুল, তবে একটি নতুন উত্তর যুক্ত করুন, তবে 'আরও একটি উত্তর' প্রশ্নটি জিজ্ঞাসিত হওয়ার দীর্ঘ সময় পরে একই বুনিয়াদি তথ্য প্রদান করে ' আপনি অনেক ক্রেডিট অর্জন করবেন না।
জোনাথন লেফলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.