সি ++ শিরোনাম ফাইলগুলিতে কেন # আইডিফাইনফ এবং # ডেফাইন ব্যবহার করা হয়?


495

আমি সাধারণত শিরোলেখ ফাইলগুলির শুরুতে এই জাতীয় কোড দেখতে পাচ্ছি:

#ifndef HEADERFILE_H
#define HEADERFILE_H

ফাইলটির শেষে রয়েছে

#endif

এটার উদ্দেশ্য কি?


36
+1 - আমারও একই সন্দেহ ছিল এবং আমি এখানে আরও অনেক ভাল উত্তর পেয়েছি, ভবিষ্যতের দর্শকদের জন্য উপকারী হতে পারে: স্ট্যাকওভারফ্লো.com
আবিদ রহমান কে

6
আমি এটিতে যুক্ত করতে চাই যে আপনি একবার # প্রগমাটিও ব্যবহার করতে পারেন , এটিই আপনাকে করতে হবে এবং এটি ইফডেফের মতো একই উদ্দেশ্যে কাজ করে। দু'জনের তুলনার জন্য দেখুন: stackoverflow.com/questions/1143936/…
মাত্রা

3
কী কী তা উল্লেখ করার জন্য সেরা #pragma: এটি একটি সংকলক-নির্দিষ্ট বৈশিষ্ট্য সক্রিয় করে। যদিও #pragma onceহয় খুব ব্যাপকভাবে সমর্থিত, এটা নন-স্ট্যান্ডার্ড আছে।
পোটোসওয়টার

3
@ মাত্রা: জিএনইউর নিজস্ব ডকুমেন্টেশন ( info cppবা এখানে দেখুন ) বলছে "এটি সমস্ত প্রিপ্রোসেসর দ্বারা স্বীকৃত নয়, সুতরাং আপনি কোনও বহনযোগ্য প্রোগ্রামে এটির উপর নির্ভর করতে পারবেন না"। আর গনুহ CPP সাধারণ এবং পোর্টেবল সেরা অনুকূল রূপ #ifndefবাগ্ধারা তাই এটি দক্ষ হিসাবে এর #pragma once
কিথ থম্পসন

3
কিছু বিষয় বিবেচনা করতে হবে: আন্ডারস্কোর দিয়ে শুরু হওয়া ম্যাক্রো নাম ব্যবহার করবেন না; যেমন সনাক্তকারীগুলি বাস্তবায়নের জন্য সংরক্ষিত। আরও সূক্ষ্মভাবে, #ifndef HEADERFILE_Hপ্রয়োগের শিরোনামের নামের স্থানটি লঙ্ঘন করতে পারে যা দিয়ে শুরু হয় E; শনাক্তকারী Eএবং একটি অঙ্ক বা বড় হাতের অক্ষর দিয়ে সংরক্ষিত থাকে <errno.h>। আমার পরামর্শ #ifndef H_HEADERFILE
কিথ থম্পসন

উত্তর:


525

এগুলিকে # অন্তর্ভুক্ত প্রহরী বলা হয় ।

একবার শিরোনাম অন্তর্ভুক্ত করা হলে, এটি একটি অনন্য মান (এই ক্ষেত্রে HEADERFILE_H) সংজ্ঞায়িত করা হয়েছে কিনা তা পরীক্ষা করে । তারপরে যদি এটি সংজ্ঞায়িত না হয় তবে এটি এটিকে সংজ্ঞায়িত করে এবং বাকী পৃষ্ঠাতে অবিরত রাখে।

কোডটি আবার অন্তর্ভুক্ত করা ifndefহলে, প্রথমটি ব্যর্থ হয় যার ফলে একটি ফাঁকা ফাইল হয়।

এটি টাইপ, এনামস এবং স্ট্যাটিক ভেরিয়েবলের মতো কোনও শনাক্তকারীর দ্বিগুণ ঘোষণাকে বাধা দেয়।


কোনিং বার্ড চতুর্থ: ভিসির এমনকি এটির মতো একটি রয়েছে #pragma once:-)
জয়ে

95
এছাড়াও এটি পুনরাবৃত্তিমূলক অন্তর্ভুক্তিগুলি রোধ করে ... কল্পনা করুন "এলিস এইচ" এর মধ্যে "বব হিচ" রয়েছে এবং "বব এইচ" তে "এলিস এইচ" অন্তর্ভুক্ত রয়েছে এবং তাদের প্রহরীও অন্তর্ভুক্ত নেই ...
কেভিন ডাং

@ কেভিন: এটাই আমার অর্থ। আমি ফর্মটি ম্যানিপুলেট করার জন্য খোলার একটি কৌশলটি পরিচালনা করতে চেয়েছিলাম। এটি প্রচুর ত্রুটি দিয়েছে এবং আমি কী করব তা জানতাম না। আমি ছেড়ে দিয়েছি =)

6
@ Јοеу: #pragma onceবহনযোগ্য নয়; সাধারণ #ifndefরীতিমত পরামর্শ দেওয়া হয়।
কিথ থম্পসন

2
@ সিআইফোর্স কুকিজ আপনার প্রিয় সার্চ ইঞ্জিনে "একটি সংজ্ঞা বিধি" মুছুন।
ডেভিড শোয়ার্টজ

33
#ifndef <token>
/* code */
#else
/* code to include if the token is defined */
#endif

#ifndefপ্রদত্ত টোকেনটি #definedআগে ফাইলটিতে বা অন্তর্ভুক্ত ফাইলটিতে ছিল কিনা তা যাচাই করে ; যদি তা না হয় তবে এটির মধ্যে এবং এর সমাপ্তির কোড #elseবা যদি #elseউপস্থিত না থাকে তবে #endifবিবৃতি অন্তর্ভুক্ত করে। #ifndefএকবার ফাইল অন্তর্ভুক্ত হয়ে গেলে এবং টোকেনটি সেই ফাইলের শীর্ষে সেট করা হয়নি তা পরীক্ষা করে একটি টোকেন সংজ্ঞায়িত করে প্রায়শই শিরোনাম ফাইলকে আদর্শবান করতে ব্যবহৃত হয়।

#ifndef _INCL_GUARD
#define _INCL_GUARD
#endif

4
আন্ডারস্কোর দিয়ে শুরু করা সনাক্তকারীগুলি সংরক্ষিত রয়েছে; আপনি তাদের নিজের ব্যাখ্যা করা উচিত নয়। এর মতো কিছু ব্যবহার করুন #ifndef H_HEADER_NAME
কিথ থম্পসন

5
আমি জানি এটি একটি পুরানো মন্তব্য, তবে প্রকৃতপক্ষে আন্ডারস্কোর সীমাবদ্ধতা কেবলমাত্র "বাহ্যিক শনাক্তকারী" - প্রয়োগকারীদের ক্ষেত্রে প্রযোজ্য যা সংকলিত অবজেক্টের প্রতীক টেবিল, অর্থাৎ গ্লোবাল ভেরিয়েবল এবং ফাংশন নামগুলিতে শেষ হতে পারে। এটি ম্যাক্রো নামের ক্ষেত্রে প্রযোজ্য নয়।
স্টু

1
স্টুর মন্তব্য কি সত্য? আমি কেবল স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 228783/… পড়েছি এবং এখন আমি এতটা নিশ্চিত নই।
উইল

9

এটি একাধিক সময় একই হেডার ফাইলটির একাধিক অন্তর্ভুক্তি থেকে রোধ করে।

#ifndef __COMMON_H__
#define __COMMON_H__
//header file content
#endif

ধরুন আপনি এই হেডার ফাইলটি একাধিক ফাইলে অন্তর্ভুক্ত করেছেন। সুতরাং প্রথমবার __COMMON_H__ সংজ্ঞায়িত করা হয়নি, এটি সংজ্ঞায়িত হবে এবং শিরোনাম ফাইলটি অন্তর্ভুক্ত হবে।

পরের বার __COMMON_H__ সংজ্ঞায়িত করা হয়েছে, সুতরাং এটি আবার যুক্ত হবে না।


1

এগুলিকে ইফদেফ বলা হয় বা প্রহরী অন্তর্ভুক্ত থাকে।

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

#ifndef checks whether HEADERFILE_H is not declared.
#define will declare HEADERFILE_H once #ifndef generates true.
#endif is to know the scope of #ifndef i.e end of #ifndef

যদি এটি ঘোষণা না করা হয় যার অর্থ # আইডিফাইফ সত্যটি উত্পন্ন হয় তবে কেবল # আইফেন্ডেফ এবং # এন্ডিফের মধ্যে থাকা অংশটি অন্যথায় কার্যকর করা হবে না। এটি শনাক্তকারীদের, এনামগুলি, কাঠামো ইত্যাদিকে আবার ঘোষণা করা থেকে বিরত করবে ...

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