# প্রাগমা কি একবার সি ++ 11 মানের অংশ?


140

Ditionতিহ্যগতভাবে, সি ++ এ একাধিক শিরোনাম অন্তর্ভুক্তি এড়ানোর স্ট্যান্ডার্ড এবং পোর্টেবল উপায় হ'ল / ম্যাক্রো-গার্ড স্কিম#ifndef - #define - #endif নামে পরিচিত প্রাক-সংকলক নির্দেশিকা স্কিমটি ব্যবহার করা ছিল (নীচে কোড স্নিপেট দেখুন)।

#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
...
#endif

বেশিরভাগ বাস্তবায়ন / সংকলকগুলিতে (নীচের চিত্রটি দেখুন) তবে আরও একটি "মার্জিত" বিকল্প রয়েছে যা ম্যাক্রো-গার্ড প্রকল্প হিসাবে ডাকা একই উদ্দেশ্যে কাজ করে #pragma once#pragma onceকম কোড, নাম সংঘর্ষ এড়ানো এবং কখনও কখনও সংকলনের গতি উন্নত সহ ম্যাক্রো-গার্ড স্কিমের তুলনায় বেশ কয়েকটি সুবিধা রয়েছে।

এখানে চিত্র বর্ণনা লিখুন

কিছু গবেষণা করে, আমি বুঝতে পেরেছিলাম যে যদিও #pragma onceনির্দেশটি প্রায় সমস্ত পরিচিত সংকলক দ্বারা সমর্থিত হয় তবে নির্দেশটি #pragma onceসি ++ 11 মানের অংশ কিনা তা নিয়ে একটি অশান্তি রয়েছে ।

প্রশ্নাবলী:

  • #pragma onceনির্দেশিকাটি সি ++ 11 মানের অংশ কিনা তা কি কেউ স্পষ্ট করতে পারেন?
  • যদি এটি সি ++ 11 স্ট্যান্ডার্ডের অংশ না হয় তবে পরবর্তী রিলিজগুলিতে এটি অন্তর্ভুক্ত করার কোনও পরিকল্পনা রয়েছে (যেমন, সি ++ 14 বা তার পরে)?
  • যদি কেউ কৌশলগুলির (যেমন ম্যাক্রো-গার্ড বনাম #pragma once) কোনও একটির ব্যবহারের সুবিধাগুলি / অসুবিধাগুলি সম্পর্কে আরও বিস্তারিতভাবে বর্ণনা করতে পারে তবে এটিও দুর্দান্ত হবে ।

9
ঘটনাক্রমে, শিরোনাম রক্ষীদের জন্য ডাবল আন্ডারস্কোর ব্যবহার করা মান দ্বারা নিষিদ্ধ, যা ডাবল আন্ডারস্কোর (অন্যগুলি ছাড়াও) দিয়ে শুরু হওয়া সমস্ত চিহ্নগুলি বাস্তবায়নের জন্য সংরক্ষণ করে।
মাত্তেও ইটালিয়া

9
মূলধনীর পরে একটি শীর্ষস্থানীয় আন্ডারস্কোর ব্যবহার নিষিদ্ধ is দ্বিতীয়ত, অশান্তি কোথায়? আমি কেবল সংকলক সমর্থন দেখতে পাচ্ছি, আমি কোনওই দাবি করি না যে এটি স্ট্যান্ডার্ডের অংশ?
ইয়াক্ক - অ্যাডাম নেভ্রামামন্ট

1
তৃতীয় বুলেটপয়েন্ট সম্পর্কিত সম্পর্কিত প্রশ্নের দিকে নজর দিন: # প্রাগমা কি একবার নিরাপদে রক্ষী অন্তর্ভুক্ত? এটি এমন পরিস্থিতি পেয়েছিল যেখানে শিরোনাম রক্ষীরা কাজ করে তবে #pragma onceসাধারণত হয় না।
ব্যবহারকারী 1942027

1
সম্ভাব্য নকল যাতে এটি সি ++ 11 উল্লেখ না করেই এই প্রশ্নের উত্তর দেয়।
ইয়াক্ক - অ্যাডাম নেভ্রামাউন্ট

3
ঠিক আছে, এটি কোনও অফিসিয়াল ডকুমেন্টে কোড করা হয়নি, তবে আপনি এটিকে ডি ফ্যাক্টো স্ট্যান্ডার্ড হিসাবে বিবেচনা করতে পারেন ।
সিয়ুয়ান রেন

উত্তর:


107

#pragma onceহয় না মান। এটি একটি বিস্তৃত (তবে সর্বজনীন নয়) এক্সটেনশন, যা ব্যবহার করা যেতে পারে

  • যদি আপনার বহনযোগ্যতা উদ্বেগ সীমিত হয়, এবং
  • আপনি নিশ্চিত হতে পারেন যে আপনার অন্তর্ভুক্ত সমস্ত ফাইল সর্বদা স্থানীয় ডিস্কে থাকে।

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

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


11
কেবল দূরবর্তী মাউন্টগুলিই নয়। হার্ডলিঙ্কস, সফটলিঙ্কস, সাবস্ট্রাক্ট কনস্ট্রাক্টসগুলি (উইন্ডোজে)। এটি সত্যিই অগোছালো হতে পারে।
টনি

45
সংকলকগুলি ফাইল শনাক্ত করতে SHA-1 বা MD5 চেকসাম ব্যবহার করতে পারে না কেন?
সের্গেই

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

38
যদি আপনার কোডে প্রতীকী লিঙ্ক বা অদ্ভুত মাউন্টগুলির মাধ্যমে বিভিন্ন অবস্থানের কিছু ফাইল অন্তর্ভুক্ত থাকে তবে এটি ইতিমধ্যে পোর্টেবল নয়। সুতরাং যুক্তি যা pragma onceপোর্টেবলভাবে এমন কিছু বাস্তবায়ন করতে পারে না যা অন্তর্নিহিতভাবে বহনযোগ্য নয় (এবং এমনকি এটি বিবেচনা করা উচিত নয়) এটি সি ++ এর উল্টো বিশ্বের আরও একটি বাজে কথা।
ডক

7
@ জোসেআন্টোনিওডুরা ওলমোস আমি সম্মত হই যে প্রতীকী লিঙ্কগুলি একটি ওএস বৈশিষ্ট্য, যা সি ++ ভাষার বাইরে নয়। সুতরাং প্রশ্ন উঠেছে কেন সি ++ কমিটিকে এমন কিছু বিবেচনা করা উচিত যা ভাষার আওতার বাইরে? এমন কোনও কিছুর গ্যারান্টি দেওয়ার চেষ্টা করা যা তাদের দায়িত্ব নয় কোনও আইএমও তৈরি করে না। ডস ফাইলের নাম অনুসারে কেবল 8 + 3 অক্ষরকে সমর্থন করেছে, তবুও কেউ তর্ক করেনি যে #includeমুছে ফেলতে হবে, কারণ নির্দেশের অন্ধভাবে অপব্যবহার করতে পারে। #pragma onceসংকলন ভাঙ্গার জন্য আপনি প্রতীকী লিঙ্কগুলি ব্যবহার করবেন না এটি সরবরাহ করে কোনওভাবেই বহনযোগ্যতা সীমাবদ্ধ করে না।
ডক

32

স্ট্যান্ডার্ড ( N3936 খসড়া) এর §16.6 বিভাগটি নির্দেশগুলি বর্ণনা করে #pragma:

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

# pragma pp-tokensopt new-line

বাস্তবায়নকে একটি বাস্তবায়ন-সংজ্ঞায়িত পদ্ধতিতে আচরণের কারণ করে। আচরণটি অনুবাদকে ব্যর্থ হতে পারে বা অনুবাদককে বা ফলস্বরূপ প্রোগ্রামটি অ-সম্মতিযুক্ত পদ্ধতিতে আচরণ করতে পারে। বাস্তবায়নের দ্বারা স্বীকৃত নয় এমন কোনও প্রগমা উপেক্ষা করা হবে।

মূলত #pragma onceএকটি #pragmaনির্দেশনার একটি বাস্তবায়ন নির্দিষ্ট উদাহরণ , এবং না, এটি মানক নয়। এখনো.

এটি প্রায়শই জিসিসি এবং ক্ল্যাং সহ বেশিরভাগ "প্রধান সংকলক" দ্বারা সমর্থিত হয় এবং তাই মাঝে মাঝে অন্তর্ভুক্ত-প্রহরীদের বয়লারপ্লেট এড়ানোর পরামর্শ দেওয়া হয়।


10
নোট করুন যে আপনি #pragmaএবং #defineশিরোনাম-রক্ষক উভয়ই করতে পারেন ।
ইয়াক্ক - অ্যাডাম নেভ্রামামন্ট

18
"প্রয়োগের দ্বারা স্বীকৃত নয় এমন কোনও প্রগমা উপেক্ষা করা হবে" । এর অর্থ কি এই বার্তাটি: সতর্কতা: অচেনা প্রাগমা নির্দেশনা মেনে চলা নয়?
রডরিগো

6
"এবং তাই অন্তর্ভুক্ত-রক্ষীদের বয়লারপ্লেট এড়ানোর প্রস্তাবিত উপায়" - একটি খুব সাহসী বক্তব্য। এটি একটি অ-মানক উপায় এবং এটি ব্যবহারের সুবিধাগুলি খুব কম এবং আমার অভিজ্ঞতার সাথে খুব কমই প্রাসঙ্গিক হয়েছিল, সুতরাং আমাকে আমার +1 দূরে নিয়ে যেতে হয়েছিল।
অ্যালেক্স

19
@ ইয়াক্ক: যদি কেউ #defineশিরোনাম-রক্ষী লেখেন তবে তার কাছে লেখার কোনও কারণ নেই #pragma once
নওয়াজ

5
@ নাওয়াজ একটি সংকলক প্রতিটি ফাইলের (ক্যাথ ধরে) একটি ক্যাশে রাখতে পারে যা #pragma onceডি হয়েছে , এবং এটি #includeআবার ডি হলে এমন ঘটনাটি এড়িয়ে যেতে পারে #include(ফাইলটিও খুলতে পারে না)। জিডিসি শিরোনাম রক্ষীদের সাথে একই কাজ করে তবে এটি খুব, খুব ভঙ্গুর। #pragmaএক কাজ করা সহজ, হেডার পাহারা এক কঠিন।
ইয়াক্ক - অ্যাডাম নেভ্রামামন্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.