প্রিপ্রোসেসর নির্দেশিকা ব্যবহার করা ভাল নাকি (ধ্রুবক) বিবৃতি?


10

ধরা যাক আমাদের একটি কোডবেস রয়েছে যা অনেকগুলি বিভিন্ন কস্টুমার্সের জন্য ব্যবহৃত হয় এবং এতে আমাদের কিছু কোড রয়েছে যা কেবলমাত্র টাইপ এক্স এর কস্টিউমারের জন্য প্রাসঙ্গিক। বিবৃতি যদি ব্যবহার করতে চান? পরিষ্কার হতে হবে:

// some code
#if TYPE_X_COSTUMER  = 1
// do some things
#endif
// rest of the code

অথবা

if(TYPE_X_COSTUMER) {
    // do some things
}

আমি যে যুক্তিগুলি সম্পর্কে ভাবতে পারি সেগুলি হ'ল:

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

পছন্দনীয় কী - যখন বিভিন্ন কস্টুমারদের জন্য কোনও কোড বেসের কথা বলছেন?


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

@ ডেলানান - কোডটি বিভিন্ন বিভিন্ন সংকলক সহ বিভিন্ন প্ল্যাটফর্মের জন্য ব্যবহৃত হয়। এবং প্রভাব সম্পর্কিত - এটি কিছু ক্ষেত্রে হতে পারে।
এমবিআইডি

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

@ ডব্লিউটিপি - না আমি ছিলাম না, আমি আরও জানতে আগ্রহী তাই ভবিষ্যতে আরও ভাল সিদ্ধান্ত নেব।
এমবিডিডি

আপনার দ্বিতীয় উদাহরণে, TYPE_X_CUSTOMERএখনও একটি প্রিপ্রোসেসর ম্যাক্রো?
স্পষ্টত

উত্তর:


5

আমি মনে করি যে আপনি উল্লেখ না করে এমন একটি # নির্দিষ্ট ব্যবহারের একটি সুবিধা রয়েছে এবং এটি হ'ল আপনি কমান্ড লাইনে মানটি সেট করতে পারেন (সুতরাং এটি আপনার এক-পদক্ষেপের বিল্ড স্ক্রিপ্ট থেকে সেট করুন)।

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


আসলে, এই হল এমবেডেড সিস্টেমের জন্য
MByD

সমস্যাটি হ'ল এম্বেড করা সিস্টেমগুলি সাধারণত কিছু প্রাচীন সংকলক ব্যবহার করে (উদাহরণস্বরূপ জিসিসি ২.৯৯)।
BЈовић

@ ভিজেও - জিসিসি ভাগ্যবান মামলা :)
এমবিডি

এটি চেষ্টা করে দেখুন। যদি এতে অব্যবহৃত কোড অন্তর্ভুক্ত থাকে এবং এটি যথেষ্ট আকারের হয় তবে সংজ্ঞায়নের জন্য যান।
ট্যামস সেজেলি

আপনি যদি এটি সংকলক কমান্ড লাইনের মাধ্যমে সেট করতে সক্ষম হতে চান তবে আমি কোডটিতে নিজেই একটি ধ্রুবক ব্যবহার করব এবং কেবল সেই ধ্রুবকের জন্য নির্ধারিত মানটি নির্ধারণ করব।
কোডসইনচাউস

12

অনেক প্রশ্নের হিসাবে, এই প্রশ্নের উত্তর এটি নির্ভর করেকোনটি উত্তম তা বলার পরিবর্তে আমি উদাহরণ এবং লক্ষ্য দিয়েছি যেখানে একজনের তুলনায় একজন ভাল।

প্রিপ্রোসেসর এবং ধ্রুবক উভয়েরই যথাযথ ব্যবহারের নিজস্ব স্থান রয়েছে।

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

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

  2. পরীক্ষামূলক প্যাচগুলি: এটির
    আর একটি ক্ষেত্রে যেখানে ন্যায়সঙ্গত হওয়া যায় তা হ'ল কিছু পরীক্ষামূলক কোড যা ঝুঁকিপূর্ণ বা নির্দিষ্ট কিছু মডিউল যা বাদ দিতে হয় যা উল্লেখযোগ্যভাবে সংযোগ বা পারফরম্যান্সের পার্থক্য রাখে। যদি কেউ () এর আড়াল না করে প্রিপ্রোসেসরের মাধ্যমে কোডটি নিষ্ক্রিয় করতে চান তবে কারণ আমরা সম্ভবত এই নির্দিষ্ট পরিবর্তন সেট দ্বারা প্রবর্তিত বাগ সম্পর্কে নিশ্চিত হতে পারি না এবং আমরা পরীক্ষামূলক ভিত্তিতে চলছি। যদি এটি ব্যর্থ হয় তবে আমাদের অবশ্যই পুনরায় লেখার চেয়ে সেই কোডটি উত্পাদনে অক্ষম করা ছাড়া আর কিছুই করতে হবে না । কিছু সময় পুরো কোডটি মন্তব্য করার জন্য ব্যবহার করা আদর্শ ।#if 0

  3. নির্ভরতাগুলির সাথে মোকাবিলা করা:
    আপনি উত্পন্ন করতে পারেন এমন আরও একটি কারণ উদাহরণস্বরূপ, আপনি যদি জেপিইজি চিত্রগুলি সমর্থন না করতে চান তবে আপনি সেই মডিউল / স্টাব সংকলন থেকে মুক্তি পেতে পারেন এবং শেষ পর্যন্ত লাইব্রেরি এতে (স্থিতিশীল বা গতিশীল) লিঙ্কটি করবে না can মডিউল। কখনও কখনও প্যাকেজগুলি এই ./configureজাতীয় নির্ভরতার প্রাপ্যতা সনাক্ত করতে চালিত হয় এবং যদি গ্রন্থাগারগুলি উপস্থিত না থাকে, (বা ব্যবহারকারী সক্ষম করতে চান না) এই লাইব্রেরির সাথে লিঙ্ক না করে এই জাতীয় কার্যকারিতা স্বয়ংক্রিয়ভাবে অক্ষম করা হয়। এই নির্দেশাবলী স্বয়ংক্রিয়ভাবে উত্পন্ন হলে এখানে সর্বদা উপকারী।

  4. লাইসেন্সিং: প্রিপ্রোসেসর ডিরেক্টরটির
    একটি খুব আকর্ষণীয় উদাহরণ হ'ল ffmpeg । এটিতে কোডেক রয়েছে যা এর ব্যবহারের মাধ্যমে পেটেন্টগুলি লঙ্ঘন করতে পারে। যদি আপনি উত্সটি ডাউনলোড করেন এবং ইনস্টল করার জন্য সংকলন করেন তবে এটি আপনাকে জিজ্ঞাসা করে যে আপনি এই জাতীয় জিনিসগুলি চান বা রাখুন। কিছু শর্তের পরে কোডগুলি লুকিয়ে রাখা যদি শর্তাবলী আপনাকে আদালতে অবতরণ করতে পারে!

  5. কোড অনুলিপি:
    আকা ম্যাক্রোস। এটি ম্যাক্রোগুলি ওভার ব্যবহার করার পরামর্শ নয় - কেবলমাত্র ম্যাক্রোগুলির অনুলিপি-অনুলিপি প্রয়োগের আরও শক্তিশালী উপায় রয়েছে । তবে খুব যত্ন সহকারে এটি ব্যবহার করুন; এবং আপনি কী করছেন তা যদি আপনি জানেন তবে এটি ব্যবহার করুন। অবশ্যই ধ্রুবকরা এটি করতে পারে না। inlineযদি কেউ এটি করা সহজ হয় তবে পাশাপাশি ফাংশনগুলিও ব্যবহার করতে পারেন ।

সুতরাং আপনি যখন ধ্রুবক ব্যবহার করবেন?
প্রায় সর্বত্র।

  1. ন্যাটারের কোড প্রবাহ:
    সাধারণভাবে আপনি যখন ধ্রুবক ব্যবহার করেন তখন এটি নিয়মিত ভেরিয়েবল থেকে প্রায় পৃথক পৃথক এবং তাই এটি আরও ভাল পঠনযোগ্য কোড। আপনি যদি 75 টি লাইনের রুটিন লিখেন- প্রতি # লাইনের পরে 3 বা 4 টি লাইন থাকলে # আইডিপিডিফ খুব পড়তে অক্ষম । সম্ভবত #ifdef দ্বারা নিয়ন্ত্রিত একটি প্রাথমিক ধ্রুবক দেওয়া হয়েছে এবং এটি যেখানেই প্রাকৃতিক প্রবাহে ব্যবহার করুন।

  2. ভাল ইনডেন্ট কোড: সমস্ত প্রিপ্রোসেসর নির্দেশিকা, অন্যথায় ভাল ইনডেন্ট কোড সহ কখনই ভাল কাজ করবেন না । এমনকি যদি আপনার সংকলক # ডিফের ইন্ডেন্টেশন অনুমতি দেয় তবে প্রাক-এএনএসআই সি প্রিপ্রসেসর একটি লাইন আর "#" অক্ষর আরম্ভের মধ্যে স্থানের অনুমতি দেয় না; শীর্ষস্থানীয় "#" সর্বদা প্রথম কলামে রাখতে হবে।

  3. কনফিগারেশন:
    ধ্রুবক / বা ভেরিয়েবলগুলি বোঝার অন্য কারণ হ'ল তারা গ্লোবালগুলির সাথে সংযুক্ত হওয়া থেকে সহজেই বিকশিত হতে পারে বা ভবিষ্যতে কনফিগারেশন ফাইলগুলি থেকে উত্পন্ন হতে পারে।

একটি শেষ জিনিস: সুযোগটি অতিক্রম করার জন্য প্রিপ্রসেসর নির্দেশিকা
কখনই ব্যবহার করবেন না বা । অর্থাত শুরু বা শেষ বিভিন্ন পক্ষের । এটি অত্যন্ত খারাপ; এটি বিভ্রান্তিকর হতে পারে, এটি কিছু সময় বিপজ্জনক হতে পারে।#ifdef#endif{ ... }#ifdef#endif{ ... }

এটি অবশ্যই একটি বিস্তৃত তালিকা নয়, তবে আপনাকে সম্পূর্ণ পার্থক্য দেখায়, যেখানে কোন পদ্ধতিটি ব্যবহারের জন্য আরও উপযুক্ত। এটি আসলে কোনটি সম্পর্কে ভাল তা নয় , প্রদত্ত প্রসঙ্গে যেটি ব্যবহার করা আরও স্বাভাবিক it


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

1
"প্রফেসোসেসর নির্দেশিকাগুলি কখনও ব্যবহার করবেন না # আইডিএফ থেকে # পেরিয়ে যাওয়ার সুযোগ বা {...}" এটি আইডিইয়ের উপর নির্ভর করে। আইডিই যদি নিষ্ক্রিয় প্রিপ্রোসেসর ব্লকগুলিকে স্বীকৃতি দেয় এবং সেগুলি ধসে পড়ে বা বিভিন্ন রঙের সাথে দেখায় তবে এটি বিভ্রান্তিকর নয়।
অ্যাবিক্স

@ অ্যাবিক্স এটি সত্য যে আইডিই সাহায্য করতে পারে। তবে, এমন অনেক ক্ষেত্রে যেখানে লোকেরা * নিক্স (লিনাক্স ইত্যাদি) প্ল্যাটফর্মের অধীনে বিকাশ করে - সম্পাদকদের পছন্দ ইত্যাদি অনেকগুলি (ষষ্ঠ, ইম্যাক্স এবং অন্যান্য)। সুতরাং অন্য কেউ আপনার চেয়ে আলাদা সম্পাদক ব্যবহার করছেন।
দিপান মেহতা

4

আপনার গ্রাহকদের আপনার কোড অ্যাক্সেস আছে? যদি হ্যাঁ, তবে প্রিপ্রোসেসর আরও ভাল বিকল্প হতে পারে। আমাদের অনুরূপ কিছু রয়েছে এবং আমরা বিভিন্ন গ্রাহকের জন্য (বা গ্রাহকের নির্দিষ্ট বৈশিষ্ট্যগুলি) সংকলনের সময় পতাকা ব্যবহার করি। তারপরে কোনও স্ক্রিপ্ট গ্রাহক নির্দিষ্ট কোডটি বের করতে পারে এবং আমরা সেই কোডটি শিপ করে। গ্রাহকরা অন্যান্য গ্রাহক বা অন্যান্য গ্রাহক নির্দিষ্ট বৈশিষ্ট্য সম্পর্কে সচেতন নন।


3

উল্লেখযোগ্য কিছু অতিরিক্ত পয়েন্ট:

  1. সংকলক কিছু ধরণের ধ্রুবক অভিব্যক্তি প্রক্রিয়া করতে পারে যা প্রিপ্রোসেসর করতে পারে না। উদাহরণস্বরূপ, প্রিপ্রসেসর সাধারণত sizeof()অ-আদিম ধরণের উপর মূল্যায়নের কোনও উপায় রাখে না। এটি if()কিছু ক্ষেত্রে ব্যবহারকে বাধ্য করতে পারে ।

  2. সংকলক কোডে বেশিরভাগ সিনট্যাক্স সমস্যা উপেক্ষা করবে যা এড়িয়ে যায় #if(কিছু প্রিপ্রোসেসর সম্পর্কিত সমস্যাগুলি এখনও সমস্যার কারণ হতে পারে) তবে কোডটি ছেড়ে দেওয়া কোডের জন্য সিনট্যাক্টিক যথার্থতার উপর জোর দেয় if()। সুতরাং, যদি কোডটি কিছু বিল্ডের জন্য এড়িয়ে যায় তবে অন্যরা নয় তবে ফাইলের অন্য কোথাও পরিবর্তনের ফলে এটি অবৈধ হয়ে যায় (উদাহরণস্বরূপ নামকরণকারী শনাক্তকারী) যদি এটি অক্ষম থাকে if()তবে তা অক্ষম থাকলে না হয় তবে এটি সমস্ত বিল্ডের উপর ছড়িয়ে পড়ে #if। কোডটি কেন বাদ দেওয়া হচ্ছে তার উপর নির্ভর করে, এটি ভাল জিনিস হতে পারে বা নাও হতে পারে।

  3. কিছু সংকলক অপ্রাপ্য কোড বাদ দিবে অন্যরা তা করবে না; অ্যাক্সেসযোগ্য কোডের মধ্যে স্থিতিশীল স্টোরেজ সময়কালের ঘোষণা, তবে স্ট্রিং লিটারেলগুলি সহ, স্থান বরাদ্দ করতে পারে এমনকি কোনও কোড এইভাবে বরাদ্দকৃত স্থানটি ব্যবহার করতে পারে না।

  4. ম্যাক্রোগুলি if()তাদের মধ্যে পরীক্ষা ব্যবহার করতে পারে তবে ম্যাক্রোর মধ্যে কোনও শর্তাধীন যুক্তি সম্পাদনের জন্য প্রিপ্রোসেসরটির জন্য হায় এমন কোনও ব্যবস্থা নেই [মনে রাখবেন যে ম্যাক্রোর মধ্যে ব্যবহারের জন্য ? :অপারেটর প্রায়শই এর চেয়ে ভাল হতে পারে ifতবে একই নীতিগুলি প্রয়োগ হয়]।

  5. #ifনির্দেশ কি ম্যাক্রো সংজ্ঞায়িত পেতে নিয়ন্ত্রণ করতে ব্যবহার করা যাবে।

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


1

দীর্ঘ গল্প সংক্ষিপ্ত: প্রিপ্রোসেসর নির্দেশিকা সম্পর্কে ভয়গুলি মূলত 2, একাধিক অন্তর্ভুক্তি এবং সম্ভবত কম পাঠযোগ্য কোড এবং আরও ক্রপটিক যুক্তি।

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


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