# প্রাগমা কি একবার নিরাপদে রক্ষী অন্তর্ভুক্ত?


310

আমি পড়েছি যে ব্যবহার করার সময় কিছু সংকলক অপ্টিমাইজেশন রয়েছে #pragma onceযার ফলে দ্রুত সংকলন হতে পারে। আমি স্বীকৃত যে এটি মানহীন নয় এবং এটি ক্রস-প্ল্যাটফর্মের সামঞ্জস্যতার সমস্যা তৈরি করতে পারে।

এটি কি এমন কিছু যা নন-উইন্ডোজ প্ল্যাটফর্মগুলিতে (জিসিসি) বেশিরভাগ আধুনিক সংকলক দ্বারা সমর্থিত?

আমি প্ল্যাটফর্ম সংকলনের সমস্যাগুলি এড়াতে চাই, তবে ফ্যালব্যাক গার্ডদের অতিরিক্ত কাজ এড়াতেও চাই:

#pragma once
#ifndef HEADER_H
#define HEADER_H

...

#endif // HEADER_H

আমার কি উদ্বিগ্ন হওয়া উচিত? আমি কি এই উপর আরও কোন মানসিক শক্তি ব্যয় করা উচিত?


3
অনুরূপ প্রশ্ন জিজ্ঞাসা করার পরে , আমি জানতে পেরেছিলাম যে #pragma once২০০৮ সালে কিছু শ্রেণি দর্শন সম্পর্কিত বিষয়গুলি এড়ানো প্রত্যাশিত I'm আমি প্রহরীদের অন্তর্ভুক্ত করে #pragma onceএই সমস্ত কারণে প্রতিস্থাপন করে of
স্ম্যাকএল

উত্তর:


188

ব্যবহারে যে #pragma onceকোনও আধুনিক সংকলক কাজ করা উচিত, তবে আমি কোনও স্ট্যান্ডার্ড ব্যবহার না করার কোনও কারণ দেখতে পাচ্ছি না #ifndefগার্ড অন্তর্ভুক্ত। এটা ঠিক কাজ করে। একটি সতর্কতা হ'ল জিসিসি সংস্করণ 3.4 এর#pragma once আগে সমর্থন করে নি ।

আমি এটিও খুঁজে পেয়েছি, কমপক্ষে জিসিসিতে, এটি মানকে স্বীকৃতি দেয় #ifndefএবং এটি অনুকূল করে তোলে , সুতরাং এটি এর চেয়ে ধীর হওয়া উচিত নয় #pragma once


12
এটি মোটেও ধীর হওয়া উচিত নয় (যাইহোক জিসিসি সহ)।
জেসন কোকো

54
এটি সেভাবে বাস্তবায়িত হয়নি। পরিবর্তে, যদি ফাইলটি প্রথমবারের মতো #Fndef দিয়ে শুরু হয় এবং একটি #endif দিয়ে শেষ হয়, জিসিসি এটি মনে রাখে এবং সর্বদা ফাইলটি খোলার জন্য বিরক্ত না করে ভবিষ্যতে অন্তর্ভুক্ত হয় এমন এড়িয়ে যায়।
জেসন কোকো

10
#pragma onceফাইলটি প্রিপ্রোসেস করা হয় না বলে সাধারণত দ্রুত হয়। ifndef/define/endifযাইহোক প্রিপ্রোসেসিং প্রয়োজন, কারণ এই ব্লকের পরে আপনার কিছু সংকলনযোগ্য হতে পারে (তাত্ত্বিকভাবে)
অ্যান্ড্রে

13
গার্ড ম্যাক্রো অপ্টিমাইজেশনে জিসিসি ডক্স: gcc.gnu.org/onlinesocs/cppinternals/Guard-Macros.html
অ্যাড্রিয়ান

38
রক্ষীদের অন্তর্ভুক্ত রাখার জন্য অতিরিক্ত অতিরিক্ত প্রয়োজনীয়তা রয়েছে যা আপনাকে অবশ্যই একটি নতুন প্রতীক #ifndef FOO_BAR_Hযেমন "foo_bar.h" এর মতো কোনও ফাইলের জন্য অবশ্যই নির্ধারণ করতে হবে । আপনি যদি পরে এই ফাইলটির নাম পরিবর্তন করেন, তবে এই কনভেনশনের সাথে সামঞ্জস্য হওয়ার জন্য আপনার অন্তর্ভুক্ত প্রহরীদের সমন্বয় করা উচিত? এছাড়াও, যদি আপনার কোড গাছের দুটি পৃথক জায়গায় দুটি স্বতন্ত্র foo_bar.h গুলি থাকে তবে আপনাকে প্রত্যেকটির জন্য দুটি পৃথক চিহ্ন বিবেচনা করতে হবে। সংক্ষিপ্ত উত্তরটি ব্যবহার করা #pragma onceএবং যদি আপনাকে সত্যই এমন পরিবেশে সংকলন করতে হয় যা এটি সমর্থন করে না, তবে এগিয়ে যান এবং সেই পরিবেশের জন্য প্রহরীদের অন্তর্ভুক্ত করুন।
ব্র্যান্ডিন

327

#pragma once এর একটি অপূর্ণতা রয়েছে (অ-মানক ছাড়া অন্যটি) এবং তা হ'ল যদি আপনার বিভিন্ন স্থানে একই ফাইল থাকে (আমাদের এটি কারণ আমাদের বিল্ড সিস্টেমের চারপাশে ফাইলগুলি অনুলিপি করে থাকে) তবে সংকলকটি এটিকে আলাদা ফাইল বলে মনে করবে।


36
তবে আপনার বিভিন্ন স্থানে একই নামের দুটি ফাইলও থাকতে পারে বিভিন্ন # ডেফাইন নাম্বার তৈরি করতে বিরক্ত না করে, যা HEADERFILENAME_H
ভার্গাস

69
একই # ডিফাইন WHATVER এর সাথে আপনার দু'এর বেশি ফাইলও থাকতে পারে যা মজাদার কোনও শেষের কারণ না করে, এই কারণেই আমি একবার প্রাগমা ব্যবহারের পক্ষে চাই।
ক্রিস হুয়াং-লিভার

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

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

3
@ আরক্সান্টোস, ফাইলগুলি #ifdefম্যাক্রোর মান পার্থক্য করলেও পৃথক হতে পারে।
মোটি

63

আমার ইচ্ছা #pragma once(বা এর মতো কিছু) স্ট্যান্ডার্ডে ছিল। অন্তর্ভুক্ত রক্ষীরা আসলে কোনও বড় বিষয় নয় (তবে তারা ভাষা শেখার লোকদের বোঝাতে কিছুটা কঠিন বলে মনে হয়), তবে এটি একটি ছোট্ট বিরক্তির মতো বলে মনে হচ্ছে যা এড়ানো যায়।

আসলে, 9998% সময়কালের পরে, #pragma onceআচরণটি পছন্দসই আচরণ, যদি কোনও শিরোনামের একাধিক অন্তর্ভুক্তি প্রতিরোধকারী স্বয়ংক্রিয়ভাবে সংকলক দ্বারা পরিচালনা করা হয় #pragmaবা একটি বা দ্বিগুণ অন্তর্ভুক্ত করার অনুমতি দেয় তবে এটি ভাল হত ।

তবে আমাদের যা আছে তা আমাদের কাছে রয়েছে (আপনার কাছে নাও থাকতে পারে #pragma once)।


48
আমি সত্যিই যা চাই তা একটি আদর্শ #importনির্দেশ।
জন

10
মানক আমদানির নির্দেশিকা আসছে: isocpp.org/blog/2012/11/… তবে এখনও এখানে নেই। আমি এর সমর্থনে দৃ strongly়ভাবে আছি।
এহেলপস

6
@ হেল্পস ভ্যাপারওয়্যার এখন কি প্রায় পাঁচ বছর কেটে গেছে? সম্ভবত 2023 এ আপনি এই মন্তব্যে ফিরে এসে "আমি আপনাকে তাই বলেছি" বলবেন।
doug65536

এটি বাষ্পওয়্যার নয়, এটি কেবল প্রযুক্তিগত বিবরণ পর্যায়ে। মডিউল ভিসুয়াল স্টুডিও 2015 (বাস্তবায়িত হয় blogs.msdn.microsoft.com/vcblog/2015/12/03/... () এবং ঝনঝন মধ্যে clang.llvm.org/docs/Modules.html )। এবং এটি # আমদানি নয়, আমদানি।
এহেলপস

এটি সি ++ ২০ এ তৈরি করা উচিত।
আয়নোক্লাস্ট ব্রিগহাম

36

আমি কোনও পারফরম্যান্স সুবিধা সম্পর্কে জানি না তবে এটি অবশ্যই কার্যকর হয়। আমি এটি আমার সমস্ত সি ++ প্রকল্পে ব্যবহার করি (আমি এমএস সংকলক ব্যবহার করছি মঞ্জুর)। আমি এটি ব্যবহারের চেয়ে বেশি কার্যকর বলে মনে করি

#ifndef HEADERNAME_H
#define HEADERNAME_H
...
#endif

এটি একই কাজ করে এবং অতিরিক্ত ম্যাক্রোগুলির সাহায্যে প্রিপ্রসেসরকে পপুলেট করে না।

জিসিসি #pragma onceআনুষ্ঠানিকভাবে সংস্করণ 3.4 হিসাবে সমর্থন করে ।


25

জিসিসি #pragma once৩.৪- র পরে সমর্থন করে , আরও সংকলক সহায়তার জন্য http://en.wikedia.org/wiki/Pragma_once দেখুন ।

#pragma onceরক্ষীদের অন্তর্ভুক্ত করার বিপরীতে আমি যে বড় উলটোটি ব্যবহার করতে দেখছি তা হ'ল অনুলিপি / পেস্ট ত্রুটিগুলি এড়ানো।

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

টিএল; ডিআর: #pragma onceব্যবহার করা সহজ।


11

আমি এটি ব্যবহার করি এবং এতে আমি খুশি, কারণ একটি নতুন শিরোনাম তৈরি করতে আমাকে আরও কম টাইপ করতে হবে। এটি আমার জন্য তিনটি প্ল্যাটফর্মে দুর্দান্ত কাজ করেছে: উইন্ডোজ, ম্যাক এবং লিনাক্স।

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

শেষ পর্যন্ত, প্রহরী বা প্রগমা ব্যবহার করে মোটেই কিছু আসে যায় না।


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

1
রি সি ++ পার্সিং স্লোনেস বনাম সি #। সি # তে আপনাকে প্রতিটি ক্ষুদ্র সি ++ ফাইলের জন্য কয়েক হাজার এলওসি হেডার ফাইল (আইওস্ট্রিম, কারও?) পার্স করতে হবে না। এই সমস্যাটি আরও ছোট করতে
প্রাক্পম্পাইল্ড

11

' #pragma once' ব্যবহারের কোনও প্রভাব থাকতে পারে না (এটি সর্বত্র সমর্থিত নয় - যদিও এটি ক্রমবর্ধমান ব্যাপকভাবে সমর্থিত), সুতরাং আপনাকে যেভাবেই হোক শর্তসাপেক্ষ সংকলন কোডটি ব্যবহার করা দরকার, এই ক্ষেত্রে কেন ' #pragma once' দিয়ে বিরক্ত করবেন ? সংকলক সম্ভবত এটি যাহাই হউক না কেন। যদিও এটি আপনার লক্ষ্য প্ল্যাটফর্মগুলির উপর নির্ভর করে। যদি আপনার সমস্ত লক্ষ্যগুলি এটি সমর্থন করে, তবে এগিয়ে যান এবং এটি ব্যবহার করুন - তবে এটি একটি সচেতন সিদ্ধান্ত হওয়া উচিত কারণ যদি আপনি কেবল প্রগমা ব্যবহার করেন এবং তারপরে সমর্থন না করে এমন একটি সংকলককে বন্দরে রাখুন তবে সমস্ত জাহান্নাম looseিলে .ালা হয়ে যাবে।


1
আমি একমত নই যে আপনাকে যাইহোক প্রহরীকে সমর্থন করতে হবে। আপনি যদি # প্রগমা একবার ব্যবহার করেন (বা প্রহরী) এটি কারণ এটি তাদের ছাড়াই কিছু বিবাদ সৃষ্টি করে। সুতরাং এটি যদি আপনার চেন সরঞ্জাম দ্বারা সমর্থিত না হয় তবে প্রকল্পটি কেবল সংকলন করবে না এবং আপনি যখন কোনও পুরানো কেএন্ডআর সংকলকটিতে কিছু আনসিস সি সংকলন করতে চান তার চেয়ে আপনি ঠিক একই ধরণের অবস্থানে আছেন। কিছু রক্ষী যুক্ত করতে আপনাকে কেবল চ্যান্টল টু ডেট করতে হবে বা কোড পরিবর্তন করতে হবে। প্রোগ্রামটি সংকলন করে থাকলেও কাজ করতে ব্যর্থ হলে সমস্ত নরক বিরতি ঘটবে।
21:56

5

পারফরম্যান্সের সুবিধাটি হ'ল # প্রাগমা একবার পড়ার পরে ফাইলটি আবার খুলতে না পারা। প্রহরীদের সাথে, সংকলকটিকে ফাইলটি খুলতে হবে (এটি সময়ে ব্যয়বহুল হতে পারে) যাতে এটিতে আবার বিষয়বস্তু অন্তর্ভুক্ত না করা উচিত get

এটি কেবলমাত্র তাত্পর্যপূর্ণ কারণ কিছু সংকলক প্রতিটি সংকলনের ইউনিটের জন্য কোনও রিড কোড নেই এমন ফাইলগুলি স্বয়ংক্রিয়ভাবে খুলবে না।

যাইহোক, এটি সমস্ত সংকলকগুলির ক্ষেত্রে নয়, সুতরাং আদর্শিকভাবে # ক্রাগ-প্ল্যাটফর্ম কোডের জন্য একবার # এড়িয়ে চলতে হবে এটির কোনও মান নেই / মানসম্মত সংজ্ঞা এবং প্রভাব নেই। তবে, ব্যবহারিকভাবে, এটি প্রহরীদের চেয়ে সত্যই ভাল।

শেষ পর্যন্ত, ভাল পরামর্শ আপনি পেতে পারেন এই ক্ষেত্রে প্রতিটি কম্পাইলার আচরণ চেক না করে আপনার কম্পাইলার থেকে সেরা গতি আছে নিশ্চিত হতে, একবার এবং রক্ষিবাহিনী উভয় pragma ব্যবহার করা হয়।

#ifndef NR_TEST_H
#define NR_TEST_H
#pragma once

#include "Thing.h"

namespace MyApp
{
 // ...
}

#endif

এইভাবে আপনি উভয়ের মধ্যে সেরা (ক্রস-প্ল্যাটফর্ম এবং সহায়তা সংকলনের গতি) পান।

যেহেতু এটি টাইপ করার মতো দীর্ঘতর, আমি ব্যক্তিগতভাবে একটি সরঞ্জামটি ব্যবহার করি যা খুব শক্তভাবে সমস্ত তৈরি করতে সহায়তা করে (ভিজ্যুয়াল অ্যাসিস্ট এক্স)।


ভিজুয়াল স্টুডিও কি # গার্ডকে যেমন আছে তেমন অনুকূল করে না? অন্যান্য (আরও ভাল?) সংকলক তা করেন এবং আমি ধারণা করি এটি বেশ সহজ।
টম

1
আপনি কেন pragmaপরে রাখেন ifndef? কোন সুবিধা আছে?
ব্যবহারকারী 1095108

1
@ user1095108 কিছু সংকলক ফাইলটিতে কেবল কোড রয়েছে যা একবার একবার ইনস্ট্যান্ট করতে হবে তা জানার জন্য শিরোনাম রক্ষককে সীমানা হিসাবে ব্যবহার করবে will যদি কিছু কোড শিরোনাম রক্ষীদের বাইরে থাকে তবে পুরো ফাইলটি সম্ভবত একাধিকবার অস্থায়ী হিসাবে বিবেচিত হতে পারে। যদি একই সংকলক একবার প্রাগমা সমর্থন করে না, তবে এটি সেই নির্দেশকে অগ্রাহ্য করবে। সুতরাং, অন্তত শিরোনাম রক্ষীদের "অনুকূলিত" করা যেতে পারে তা নিশ্চিত করার জন্য একবার হেডার রক্ষীদের ভিতরে প্রগমা স্থাপন করা সবচেয়ে সাধারণ উপায়।
ক্লাইম

4

সবসময় না।

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52566 এ দুটি অন্তর্ভুক্ত করার জন্য বোঝানো দুটি ফাইলের একটি দুর্দান্ত উদাহরণ রয়েছে, তবে ভুলভাবে অভিন্ন টাইমস্ট্যাম্প এবং সামগ্রীর কারণে (অভিন্ন ফাইলের নাম নয়) অভিন্ন বলে মনে হয়েছিল ।


10
সংকলকটিতে এটি একটি বাগ হবে। (একটি শর্টকাট নেওয়ার চেষ্টা করা উচিত নয়)।
rxantos

4
#pragma onceনন-স্ট্যান্ডার্ড, সুতরাং সংকলক যা কিছু করার সিদ্ধান্ত নেয় তা "সঠিক"। অবশ্যই, তারপরে আমরা "প্রত্যাশিত" কী এবং "দরকারী" কী তা নিয়ে কথা বলা শুরু করতে পারি।
ব্যবহারকারী 7610

2

খুব বড় গাছগুলিতে জিসিসি ৩.৪ এবং ৪.১ ব্যবহার করা (কখনও কখনও ডিসটিসি ব্যবহার করা) ), একবারে # প্যারাগমা ব্যবহার করার পরিবর্তে, বা স্ট্যান্ডার্ডের সাথে গার্ডস অন্তর্ভুক্ত করার সময় আমি এখনও কোনও গতি দেখতে পাইনি।

সত্যিকার অর্থে কোনও সঞ্চয় নেই বলে এর জিসিসির পুরানো সংস্করণগুলি, এমনকি অন্যান্য সংকলকগুলি কীভাবে তার মূল্যকে বিভ্রান্ত করছে তা আমি সত্যিই দেখছি না। আমি বিভিন্ন ডি-লাইন্টারের সমস্ত চেষ্টা করে দেখিনি, তবে আমি বাজি রাখতে ইচ্ছুক এটি তাদের অনেককেই বিভ্রান্ত করবে।

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

আপনি যদি উল্লেখযোগ্য গতি বাড়িয়ে দেখেন তবে আপনার প্রশ্নটি আপডেট করুন update


2

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

আমি কেবল # প্রগমা একবার ব্যবহার করি না কারণ এর কোনও লাভ নেই। অন্যান্য গার্ডদের সাথে সংঘর্ষ এড়াতে আমি এর মতো কিছু ব্যবহার করি: CI_APP_MODULE_FILE_H -> সিআই = কোম্পানী সূচনা; অ্যাপ্লিকেশন = আবেদনের নাম; বাকীটি স্ব-ব্যাখ্যামূলক।


19
এটি কি টাইপিং থেকে খুব কম সুবিধা হয় না?
অ্যান্ড্রে

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

1
"আজ পুরানো-বিদ্যালয়ের অন্তর্ভুক্ত রক্ষীরা একবার # প্রগমা হিসাবে তত দ্রুত" " আজ, এবং অনেক অনেক বছর আগে। জিসিসি সাইটের প্রাচীনতম ডক্সগুলি 2001 থেকে 2.95 এর জন্য এবং রক্ষীদের অন্তর্ভুক্ত করার জন্য তখন নতুন ছিল না। এটি সাম্প্রতিক অপ্টিমাইজেশন নয়।
জোনাথন ওয়েকেলি

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

2

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

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

প্রগমা সমর্থন করে না এমন সংকলকগুলিতে আমি ম্যানুয়াল বাস্তবায়ন দেখেছি যা কিছুটা জটিল are

#ifdef FOO_H
#include "foo.h"
#endif

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


1
"এটি বলেছিল, আজকাল সংকলকগণ (জিসিসি সহ) একবারে প্রাগমার মতো রক্ষীদের অন্তর্ভুক্ত করার জন্য যথেষ্ট স্মার্ট।" তারা কয়েক দশক ধরে এটি করে চলেছে, সম্ভবত এটির চেয়ে বেশি দীর্ঘকাল #pragma once!
জোনাথন ওয়েকেলি

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

1
না, এটি ভুল, শালীন সংকলকরা একবারও # প্রাগমা ছাড়াই পুরো ফাইলটি বাইরে রেখে দেয়, তারা দ্বিতীয়বার ফাইলটি খোলেন না এবং তারা এটি দ্বিতীয়বারের মতো দেখতেও পান না , দেখুন gcc.gnu.org/onlinesocs/ সিপিপি / একবারে কেবল-শিরোনামে html (এটি ক্যাশিংয়ের সাথে কিছুই করার নয়)।
জোনাথন ওয়েকেলি

1
আপনার লিঙ্ক থেকে, মনে হয় যে কেবলমাত্র সিপিতেই অপ্টিমাইজেশন ঘটে happens নির্বিশেষে, ক্যাচিং খেলতে আসে। প্রিপ্রসেসর কীভাবে গার্ডের বাইরে কোড অন্তর্ভুক্ত করতে জানে। উদাহরণ ... extern int foo; # আইডিসিফ INC_GUARD # নির্ধারণ INC_GUARD ক্লাস ClassInHeader {}; #endif এক্ষেত্রে প্রিপ্রোসেসরকে বহিরাগত ইন্ট ফু অন্তর্ভুক্ত করতে হবে; আপনি একই ফাইল একাধিকবার অন্তর্ভুক্ত করা হলে একাধিকবার। দিনের শেষে, যতক্ষণ না আমরা একবার # প্রাগামার মধ্যে পার্থক্যটি বুঝতে পারি এবং ততক্ষণ পাহারাদারদের অন্তর্ভুক্ত করা হয় এবং বিভিন্ন সংকলক উভয়র সাথে কীভাবে আচরণ করে :) যতক্ষণ না এই বিষয়ে বিতর্ক করা ততক্ষণ নয়
শম্মি

1
এটি এতে অপ্টিমাইজেশন প্রয়োগ করে না, স্পষ্টতই।
জোনাথন ওয়েকেলি

1

আমরা যদি এমএসভিসি বা কিউটি (Qt 4.5 অবধি) ব্যবহার করি, যেহেতু GCC (3.4 অবধি), এমএসভিসি উভয় সমর্থন #pragma once, আমি ব্যবহার না করার কোনও কারণ দেখতে পাচ্ছি না #pragma once

উত্স ফাইলের নামটি সাধারণত সমান সমান শ্রেণীর নাম, এবং আমরা জানি, আমাদের ক্লাসের নামটি পুনঃনামকরণের জন্য আমাদের মাঝে কিছু সময় রিফ্যাক্টর দরকার হয় , তারপরে আমাদেরও পরিবর্তন করতে হবে #include XXXX, সুতরাং আমি মনে করি ম্যানুয়ালটি বজায় রাখা #include xxxxxকোনও স্মার্ট কাজ নয়। এমনকি ভিজ্যুয়াল অ্যাসিস্ট এক্স এক্সটেনশন সহ, "এক্সএক্সএক্সএক্সএক্সএক্স" বজায় রাখা কোনও প্রয়োজনীয় কাজ নয়।


1

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


সি ++ টেমপ্লেটগুলি সমস্যার সমাধান করতে পারে? সি ++ টেম্পলেট কীভাবে হয় তার কারণে আমি খুব কমই ম্যাক্রোগুলির কোনও বৈধ প্রয়োজন পাই।
ক্লিয়ারার

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

যদিও একটি নোট: নিজেই DRY নীতিটির বিপরীতে প্রতি হেডার ফাইলে গার্ড / # প্রগমা অন্তর্ভুক্ত নয়। আমি X-Macroবৈশিষ্ট্যে আপনার বক্তব্যটি দেখতে পাচ্ছি , তবে এটি অন্তর্ভুক্তের মূল ব্যবহার নয়, এটি যদি ডিআরওয়াইয়ের সাথে থাকি তবে এটি হেডার অ্যানগার্ড / # প্রগমা মাল্টের মতো অন্যভাবে হওয়া উচিত নয়?
সাইওহামমুরা

DRY এর অর্থ দাঁড়ায় "নিজেকে পুনরাবৃত্তি করবেন না"। মানুষের সম্পর্কে। যন্ত্রটি কী করছে, সেই দৃষ্টান্তের সাথে কিছুই করার নেই। সি ++ টেম্পলেটগুলি প্রচুর পুনরাবৃত্তি করে, সি-সংকলকরা এটিও করে (যেমন লুপ আন্রোলিং) এবং প্রতিটি কম্পিউটার প্রায়শই অবিশ্বাস্যর প্রায়শই পুনরাবৃত্তি করে এবং দ্রুত often
মার্সেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.