Table of Contents

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

ম্যাক্রো কি?

ম্যাক্রো SIL [FLT] ব্যবহার করে সংজ্ঞায়িত করা হয় [FLT] এবং কম্পাইল করা C-প্রসেসর এর দ্বারা নিযুক্ত করা হয় । প্রি-প্রসেসর সাধারণ টেক্সটের মধ্যে লেখা: উৎসের কোডের প্রত্যেকটা অংশ মূল কোডের সাথে যুক্ত । Sumb:LODOPLON [F] উল্লেখ করা হয় । এই ব্যাখ্যাটি পুরোপুরি ব্যাখ্যা করা যাবে এবং মূল মানের জন্য সুনির্দিষ্ট মান নির্ধারণ করা যাবে না । [F]

#define PI 3.14159 // object-like macro
#define SQUARE(x) ((x)*(x)) // function-like macro

এই পূর্বাঞ্চলীয় পদক্ষেপটি বোঝা গুরুত্বপূর্ণ কারণ ম্যাক্রোরা ফাংশন বা নমুনার মতো একই নিয়ম অনুসরণ করে না ।

কোড রিসেক্সেশন এবং মেইনটেনেন্সের জন্য ম্যাক্রোর সুবিধা

যখন অর্থপূর্ণভাবে প্রয়োগ করা হয়, ম্যাক্রোরা বড় বা যোগ্যতাসম্পন্ন কোডের বেশ কিছু মৌলিক সুবিধা প্রদান করে:

  • [[[F] CodRET [FLT][F][F]] value]: একটি সাধারণ গণনা বা ওপেন- টির মান নির্ধারণ করুন এবং এটিকে প্রোগ্রাম দ্বারা এটি ব্যবহৃত হয় । স্বয়ংক্রিয়ভাবে আপডেট করা হয় ।
  • [[[F] ম্যাজিক সংখ্যা: [F][F] এর পরিবর্তে, আক্ষরিক চিহ্নগুলোকে ভাগ করে ফেলা [FO] [FLT] [FO:] [FO [FR] [FO], তাদেরকে অর্থপূর্ণ নাম প্রদান করুন এবং তা স্বল্প মানের সঙ্গে যুক্ত করুন ।
  • [[[F] [F][F][F]] value]: ফাংশন- এর মত ম্যাক্রো একটি ফাংশনের কল এর মাথার উপরিভাগ এড়িয়ে চলে । ছোট, সাধারণ অপারেশন (যেমন, মিনিট, মিনিট, মিনিট/mx, এমনকি একাধিক ইনলাইন ফাংশানের মধ্যে দিয়ে ভরাট করা যায় না ।
  • [[[F] CREFPIOP:[F][FL][FL] [FLT], [FL] [FLT], [FO], [FO[FLT], এবং[FteS]], এই কোড একত্রিত করা, সুনির্দিষ্ট কোডের জন্য সুনির্দিষ্ট মান নির্ধারণ করুন, অথবা ব্যাক-স্পেসের কোড নির্ধারণের জন্য চিহ্নিত করা হয়।
  • [[[F] CLAY [F] এর সরল কনফিগারেশন[FLT]: একটি হেডার সহ বিভিন্ন মান দ্বারা একটি হেডার সহ ম্যাক্রোর ধরনের আচরণ আপনি একটি সম্পূর্ণ কোডের ব্যবহারকে উপলব্ধি করতে পারেন, যা বাস্তবায়নের ফাইল নয়।

রোউসট ম্যাক্রো লিখেছেন: সেরা অনুশীলন

ম্যাক্রোর নমনীয়তা তাদের বিপদও ।

সবসময় ঊর্ধ্বতন পরামিতি এবং সম্পূর্ণ অভিব্যক্তি

কারণ ম্যাক্রোগুলোকে টেক্সট হিসেবে অনুবাদ করা হয়, অপারেটররা সেগুলো ভেঙে ফেলতে পারে । [[FFLT] এর মতো একটি ম্যাক্রো [FLT] বৃদ্ধি পাবে [FLT:] [FLT] [FR] [FO [L]]] [L]]] এর সমান নয়, যা সকল পরামিতির সঙ্গে জুড়ে দেওয়া হয় ।

#define SQUARE(x) ((x) * (x)) // now SQUARE(3+2) works correctly

একাধিক আর্গুমেন্ট বিশ্লেষণ করা এড়িয়ে চলুন

ম্যাক্রো আর্গুমেন্টের বিকল্প । আর্গুমেন্ট হিসাবে বিকল্প (যেমন, যদি আর্গুমেন্টের পার্শ্ববর্তী ক্ষেত্রে প্রযোজ্য) [FL], [FLT:], উদাহরণ: উদাহরণের জন্য একবার মূল্যায়ন করা যেতে পারে ।

#define MAX(a,b) ((a) > (b) ? (a) : (b))
int x = 5;
int max = MAX(x++, 10); // expands to ((x++) > (10) ? (x++) : (10)) // x incremented twice!

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

ম্যাক্রোর নামের জন্য বড় ছাঁদের হরফের নাম ব্যবহার করা হবে

সম্মেলনের মধ্যে ম্যাক্রোগুলোকে উচ্চীকৃত অক্ষরগুলোতে লেখা হয় (যেমন, [.

মাল্টি-স্টেট ব্লকের জন্য দো-থেকে-লিউলিংয়ের সমাপ্তি

ম্যাক্রোর মধ্যে একাধিক বক্তব্য রয়েছে, যা [FLT] - র মধ্যে উল্লেখ করে । এটি নিশ্চিত করে যে ম্যাক্রোগুলো সমস্ত প্রসঙ্গে সঠিকভাবে আচরণ করে (যেমন, [FLT:]

#define LOG_ERROR(msg) do { \
 fprintf(stderr, "Error: %s\n", msg); \
 exit(1); \
} while (0)

নথি ম্যাক্রোর মাধ্যমে

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

উচ্চ পর্যায়ের ম্যাক্রো টেকনিক

এই যন্ত্রগুলোকে ব্যবহার করা আপনার ম্যাক্রোকে আরও নমনীয় করে তুলতে পারে ।

[[F][FLT]

&[[F][FLT] অপারেটর একটি ম্যাক্রোর আর্গুমেন্টকে আক্ষরিকে রূপান্তর করা হয় । এটি ডিবাগ বা লগ- ইনের জন্য উপকারী:

#define PRINT_VAR(x) printf(#x " = %d\n", x)
int value = 42;
PRINT_VAR(value); // prints: value = 42

[FLT] এর সাথে সংযোগ করা টোকেন [FLT]

প্রথম সন্ধান:

#define CREATE_VAR(prefix, index) prefix ## index
int CREATE_VAR(arr, 0) = 10; // becomes int arr0 = 10;

এক্স ম্যাক্রোস এ টোকেনের মাধ্যমে অনেক বার বার সংযোগ করা হয়েছে আর এর ফলে কোডের ধরন তৈরি করা হয়েছে।

ভারিয়াক ম্যাক্রো (সি৯৯)

C9 সালে পরিচিত ভেরীহ ম্যাক্রোস [FLT] ব্যবহার করে একটি সংখ্যা গ্রহণ করে । এটি নমনীয়ভাবে লগ করা এবং ডিবাগ ম্যাক্রোকে মসৃণ করে তোলে:

#define DEBUG_PRINT(fmt, ...) \
 fprintf(stderr, "DEBUG: " fmt, __VA_ARGS__)
DEBUG_PRINT("x = %d, y = %d", x, y);

সি.১১ এবং পরে, আপনি যদি ০[FLT] ব্যবহার করতে পারেন, তাহলে ফাঁকা আর্গুমেন্টগুলি পরিচালনা করার জন্য [FLTR] ব্যবহার করতে পারেন, পোর্ট- এর মান উন্নত।

সাধারণ জ্ঞান অর্জন এবং কীভাবে সেগুলো এড়িয়ে চলা যায়

এমনকি সি-এ-এর ডেভেলপারদের সাথে ম্যাক্রো-সম্পর্কে ত্রুটি দেখা দিয়েছে।

  • [[[F] মিসসমন বা ব্রেসলেট [FLT]: [FLT] [FLT]: একটি ম্যাক্রো যা একটি ব্লককে দীর্ঘায়িত করে কোনো ০০০ - টি দীর্ঘ একটি ব্লক কারণ ছাড়া বন্ধ করে দিতে পারে । [[F] [F]:[F]
  • [[FLT] [FOPR] বিস্ময়গুলো][FLT]: সবসময় বাবা-মা'র অস্বাভাবিকতা - উপরে ইত্যাদি।
  • [[F] [F] ফাংশনের মাধ্যমে SODOPL [FLT][F]: [FLT] value]: যদি একই নাম একটি সাধারণ লাইব্রেরি হিসেবে সংজ্ঞায়িত করেন, এটি একটি পৃথক নামকরণ বা #unial ব্যবহার করতে পারে
  • [[[F] NOFPRE:[F][F][F] chan] Object[F] sল অনুরূপ ম্যাক্রোর অনুরূপ sp[1], কিন্তু এটি ধ্রুবক নয় । শুধুমাত্র signed হলে ব্যবহৃত হয় ।
  • [[[F] ডিবাগ সমস্যা [F][F][F][F]], ডিবাগ প্রণালী: SQL [FOPL] - এর পূর্বে প্রসারিত সংখ্যা প্রসারিত করা হয়, তাই, CORADONECHON [F]G [FR] দ্বারা চিহ্নিত সংখ্যার দীর্ঘ সংখ্যার দিকে নির্দেশ করা হয় না । [F] [F] [F] [F], 1:::]G [F] [FOD], উপস্থিত শূণ্যের মধ্যে উপলব্ধ করা [FOD] [F] [F]::::::: [F.D] [F.D.D.Y.Y.Y.Y.Y.Y.Y.v.D.Y.Z].org.org.org.R.org/ দ.org/ দ.org/ দও.R.

ম্যাক্রোর বিকল্প: Comple, num, এবং Inline

আধুনিক সি. সি. এর বিকল্পসমূহ সরবরাহ করে, যা প্রায়ই ম্যাক্রোর প্রয়োজনীয়তা দূর করে:

  • [[[[[][[F][[F]][F]], part][F], p[FOPL] - র ক্ষেত্রে প্রযোজ্য নয়; কারণ এর জন্য সঠিক ধরন ও মান রয়েছে । কিন্তু সম্পূর্ণ মিলযুক্ত সকল ক্ষেত্রে তা সংরক্ষিত নয় । (ephere: [/64], বিশদ বর্ণনা অনুযায়ী, প্রথম এবং পরবর্তী ক্ষেত্রে প্রযোজ্য) । [L]
  • [[[[F][F][F][F][F][F]]:[1]]][1]], ের ক্ষেত্রে রূপে নির্ধারিত কনস্ট্যান্ট, তানদের-র ক্ষেত্রে স্বয়ংক্রিয়ভাবে ব্যবহারযোগ্য কনস্ট্যান্ট, এবং স্বয়ংক্রিয় ভাবে মান নির্ধারণ করা হয় ।
  • [[[F]] অবিভাগ [FLT]] [FLT], CRO:] [FLT], [FLT] ফাংশান দ্বারা পূর্ণরূপে, সুরক্ষিত সকল নিরাপত্তা, ডিবাগ এবং পার্শ্ববর্তী বিষয়ের ক্ষেত্রে স্বয়ংক্রিয়ভাবে গতিসম্পন্ন । উদাহরণ:.
static inline int square(int x) {
 return x * x;
}

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

প্রকৃত-বিশ্ব উদাহরণ: ডিবাগ ও কনফিগারেশন

শর্তগত প্রেক্ষাপটে ম্যাক্রোর উন্নততা এখানে দুটি ব্যবহারিক অ্যাপ্লিকেশন রয়েছে:

কম্পাইল করা Scrous নিয়ন্ত্রণ ব্যবস্থার মাধ্যমে লগ- ইন করা হচ্ছে

#ifdef DEBUG
 #define LOG(fmt, ...) fprintf(stderr, "[DEBUG] " fmt, ##__VA_ARGS__)
#else
 #define LOG(fmt, ...) /* no-op */
#endif

এই ম্যাক্রোটি শুধুমাত্র [FLT] সহ [FLT], এবং ফাঁকা ম্যাক্রোর প্রারম্ভিক কারণ [FOL] [FO[F3:] পূর্বে [F3:] [F3:] [FOPL] দ্বারা শূণ্যের সাথে সুসংগত করা হয়, যখন কোনো আর্গুমেন্টগুলি উল্লেখ করা হয় না (L) [L] [FL] এর ফলে CLAYL [F4]: [F]: [F4]

প্ল্যাটফর্ম- প্রতি:

#if defined(_WIN32) || defined(_WIN64)
 #define PLATFORM "Windows"
#elif defined(__linux__)
 #define PLATFORM "Linux"
#else
 #define PLATFORM "Unknown"
#endif

এই বিন্যাসের ওপর স্থায়ী নির্ভরতাকে সম্পূর্ণ প্রক্রিয়া বাদ দিয়ে বন্ধ করে দেয় ।

অন্তর্ভুক্ত

ম্যাক্রোগুলো Cusenters (Confe) - র কোড পুনঃসেট করতে পারে না এবং রক্ষণাবেক্ষণের জন্য একটি গুরুত্বপূর্ণ সরঞ্জাম, বিশেষ করে কর্ম প্রণালীর জন্য, বিশেষ করে প্রতিটি চক্রের গতিবেগে অথবা মধ্যে উপস্থিত প্রসঙ্গের ভিত্তিতে । সঠিকরূপে ব্যবহৃত – উচ্চমান, সীমিততার সংখ্যা এবং সঠিক মানের জন্য সুনির্দিষ্টভাবে উল্লেখকৃত শব্দগুলোর প্রয়োগ করা হয় । কিন্তু, আধুনিক পদ্ধতিতে ম্যাক্রোর পরিবর্তে ম্যাক্রোর ব্যবহার করা হয় [F] ।

এই বিকল্পের সঙ্গে ভারসাম্যযুক্ত ঐতিহ্যবাহী ম্যাক্রো শক্তি, আপনি C কোড লিখতে পারেন যা দক্ষ ও ডাকাতির মধ্যে পার্থক্য রয়েছে । পাঠের জন্য [FROL] WED [FO[FO] দ্বারা চিহ্নিত মান:L [FO:L] [FR] [FL] উল্লেখকৃত [F]:L] [F]:[F]] [F]:[F]]:L]] [F[F]]:L]] [F[3]]::::L] [F] C [F]::::::L [FO.F] [F] উল্লেখকৃত] [F] [F]