সি শর্তযুক্ত প্রাক প্রসেসর-নির্দেশিকায় স্ট্রিংগুলির তুলনা কীভাবে করা যায়


92

আমাকে সি তে এরকম কিছু করতে হবে এটি কেবল তখনই কাজ করে যদি আমি একটি চর ব্যবহার করি তবে আমার একটি স্ট্রিং দরকার। কিভাবে আমি এটি করতে পারব?

#define USER "jack" // jack or queen

#if USER == "jack"
#define USER_VS "queen"
#elif USER == "queen"
#define USER_VS "jack"
#endif

আপনি শুধু স্ট্রিম্প ব্যবহার করতে পারবেন না কেন?

@ ব্রায়ান: হ্যাঁ, আমি প্রশ্নটিও পড়েছি :-)। তিনি নিশ্চিত করতে চেয়েছিলেন যে সে জানত যে আরআরসিএমপি উপস্থিত রয়েছে, এবং প্রতিক্রিয়াটি আলোকিত হতে পারে, কারণ আমি এই # সংজ্ঞায়িত স্টাফ করার কোনও কারণ ভাবতে পারি না।

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

যদি প্রশ্নটিতে কাঙ্ক্ষিত বনাম প্রকৃত আচরণ সম্পর্কে কিছুটা আরও তথ্য অন্তর্ভুক্ত হয় তবে এটি কার্যকর হবে।
ব্রেন্ট ব্র্যাডবার্ন

উত্তর:


71

প্রিপ্রোসেসর নির্দেশিকায় সম্পূর্ণ পরিবর্তনশীল দৈর্ঘ্যের স্ট্রিং তুলনা করার কোনও উপায় আছে বলে আমি মনে করি না। আপনি সম্ভবত নিম্নলিখিতগুলি করতে পারেন:

#define USER_JACK 1
#define USER_QUEEN 2

#define USER USER_JACK 

#if USER == USER_JACK
#define USER_VS USER_QUEEN
#elif USER == USER_QUEEN
#define USER_VS USER_JACK
#endif

অথবা আপনি কোডটি কিছুটা রিফ্যাক্টর করতে পারেন এবং পরিবর্তে সি কোড ব্যবহার করতে পারেন।


4
অথবা তিনি #define USER_VS (3 - USER)এই নির্দিষ্ট ক্ষেত্রে করতে পারেন। :)
জেসি চিশল্ম

17

[আপডেট: 2018.05.03]

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

শফিক ইয়াঘমুরের উত্তর থেকে উদ্ধৃতি: সংকলনের সময় একটি সি স্ট্রিংয়ের গণনা দৈর্ঘ্য। এটি কি আসলে একটি কনটেক্সপ্রস?

সংকলনের সময় ধ্রুবক এক্সপ্রেশন মূল্যায়নের গ্যারান্টিযুক্ত নয়, আমাদের কেবল খসড়া সি ++ স্ট্যান্ডার্ড বিভাগ 5.19 থেকে একটি অ-আদর্শিক উদ্ধৃতি রয়েছে যা এই বলেছে:

[...]> [দ্রষ্টব্য: অনুবাদ চলাকালীন ধ্রুবক প্রকাশগুলি মূল্যায়ন করা যায়। শেষ নোট]

শব্দটি canবিশ্বের সমস্ত পার্থক্য তৈরি করে।

সুতরাং, এই (বা কোনও) উত্তর সম্পর্কে ওয়াইএমএমভি জড়িত constexpr, সংকলক লেখকের বর্ণনার উপর নির্ভর করে।

[আপডেট করা হয়েছে 2016.01.31]

কিছু আমার পূর্ববর্তী উত্তর পছন্দ না করায় এটি স্ট্রিং তুলনার প্রয়োজন ছাড়াই লক্ষ্য অর্জন করে ওপির পুরো দিকটি এড়িয়ে যায়compile time string compare , এখানে আরও বিস্তারিত উত্তর দেওয়া হল।

আপনি পারবেন না! C98 বা C99 এ নেই। এমনকি সি 11 এও নয়। কোনও পরিমাণ ম্যাক্রো হেরফের এটি পরিবর্তন করবে না।

const-expressionব্যবহৃত সংজ্ঞাটি #ifস্ট্রিংগুলিকে অনুমতি দেয় না।

এটি অক্ষরগুলিকে মঞ্জুরি দেয়, সুতরাং আপনি যদি নিজেকে অক্ষরের মধ্যে সীমাবদ্ধ করেন তবে আপনি এটি ব্যবহার করতে পারেন:

#define JACK 'J'
#define QUEEN 'Q'

#define CHOICE JACK     // or QUEEN, your choice

#if 'J' == CHOICE
#define USER "jack"
#define USER_VS "queen"
#elif 'Q' == CHOICE
#define USER "queen"
#define USER_VS "jack"
#else
#define USER "anonymous1"
#define USER_VS "anonymous2"
#endif

#pragma message "USER    IS " USER
#pragma message "USER_VS IS " USER_VS

আপনি পারেন! সি ++ 11 এ। আপনি যদি তুলনার জন্য একটি সংকলন সময় সহায়ক ফাংশনটি সংজ্ঞায়িত করেন।

// compares two strings in compile time constant fashion
constexpr int c_strcmp( char const* lhs, char const* rhs )
{
    return (('\0' == lhs[0]) && ('\0' == rhs[0])) ? 0
        :  (lhs[0] != rhs[0]) ? (lhs[0] - rhs[0])
        : c_strcmp( lhs+1, rhs+1 );
}
// some compilers may require ((int)lhs[0] - (int)rhs[0])

#define JACK "jack"
#define QUEEN "queen"

#define USER JACK       // or QUEEN, your choice

#if 0 == c_strcmp( USER, JACK )
#define USER_VS QUEEN
#elif 0 == c_strcmp( USER, QUEEN )
#define USER_VS JACK
#else
#define USER_VS "unknown"
#endif

#pragma message "USER    IS " USER
#pragma message "USER_VS IS " USER_VS

সুতরাং, শেষ পর্যন্ত, আপনি আপনার চূড়ান্ত স্ট্রিং মান নির্বাচন করে আপনার লক্ষ্য accomlish পরিবর্তন করতে হবে USERএবং USER_VS

আপনি সি 99 এ সংকলন টাইম স্ট্রিং তুলনা করতে পারবেন না, তবে আপনি স্ট্রিং নির্বাচন করার সময় সংকলন করতে পারেন।

আপনার যদি সত্যিই সংকলন সময়ের স্টিং তুলনা করতেই হয় তবে আপনাকে সি ++ 11 বা নতুন রূপগুলিতে পরিবর্তন করতে হবে যা সেই বৈশিষ্ট্যটিকে মঞ্জুরি দেয়।

[মূল উত্তর অনুসরণ করুন]

চেষ্টা করুন:

#define jack_VS queen
#define queen_VS jack

#define USER jack          // jack    or queen, your choice
#define USER_VS USER##_VS  // jack_VS or queen_VS

// stringify usage: S(USER) or S(USER_VS) when you need the string form.
#define S(U) S_(U)
#define S_(U) #U

আপডেট: এএনএসআই টোকেন পেস্টিং কখনও কখনও প্রকট থেকে কম হয়। ;- ডি

#ম্যাক্রোর আগে একটি একক রাখার ফলে এটি তার খালি মানের পরিবর্তে তার মানটির স্ট্রিংয়ে পরিবর্তিত হয়।

##দুটি টোকেনের মধ্যে একটি ডাবল রাখার ফলে তাদের একক টোকনে সংমিশ্রিত করা হয়।

সুতরাং, আপনি কীভাবে সেট USER_VSকরেছেন তার উপর নির্ভর করে ম্যাক্রোর সম্প্রসারণ রয়েছে jack_VSবা ।queen_VSUSER

Stringify ম্যাক্রো S(...)ম্যাক্রো অপ্রত্যক্ষ্যতার ব্যবহার করে, তাই নামে ম্যাক্রো মান একটি স্ট্রিং রূপান্তরিত হয়। পরিবর্তে ম্যাক্রো নাম।

এভাবে USER##_VSহয়ে jack_VS(অথবা queen_VS), আপনি কিভাবে সেট উপর নির্ভর করে USER

পরে, যখন স্ট্রিংফাই ম্যাক্রোটি ( এই উদাহরণে) এর S(USER_VS)মান হিসাবে ব্যবহৃত হয় তখন ইন্ডিরিশন পদক্ষেপে প্রেরণ করা হয় যা এর মানটিকে ( ) একটি স্ট্রিংয়ে রূপান্তর করে ।USER_VSjack_VSS_(jack_VS)queen"queen"

যদি আপনি সেট USERকরে থাকেন queenতবে চূড়ান্ত ফলাফলটি স্ট্রিং "jack"

টোকেন কনটেনটেশনের জন্য, দেখুন: https://gcc.gnu.org/onlinesocs/cpp/Concateation.html

টোকেন স্ট্রিং রূপান্তরকরণের জন্য, দেখুন: https://gcc.gnu.org/onlinesocs/cpp/Stringifications.html# স্ট্রিংফিকেশন

[কোনও টাইপো সংশোধন করার জন্য ২০১৫.০২.১৫ আপডেট হয়েছে]]


4
@ জেসিচিশম, আপনি কি আপনার সি ++ 11 সংস্করণ পরীক্ষা করেছেন? আমি এটি GCC 4.8.1, 4.9.1, 5.3.0 এ কাজ করতে পারি না। এতে বলা হয়েছে {to টোকেনের আগে বাইনারি অপারেটর নিখোঁজ "("}} #} if # আইফ 0 == সি_আরএসটিএম / * এখানে * / (ব্যবহারকারী,
কোয়েন

4
@JesseChisholm তাই আমি আপনার সি ++ 11 উদাহরণস্বরূপ কম্পাইল করার যদি আমি পরিবর্তন পরিচালিত #if 0 == c_strcmp( USER, JACK )করতেconstexpr int comp1 = c_strcmp( USER, JACK ); #if 0 == comp1
Dmitriy Elisov

4
@ জেসি চিশল্ম, হুম, এখনও ভাগ্য নেই। যেকোন কনস্টেক্সপ্র ভেরিয়েবলটি শূন্যের সমান হয় our আপনার #ifউদাহরণটি কেবলমাত্র ব্যবহারকারী জ্যাক হিসাবে কাজ করে। যদি ব্যবহারকারী কুইন ছিলেন, এটি বলত USER IS QUEENএবংUSER_VS IS QUEEN
দিমিত্রি এলিসভ

9
এই উত্তরের এই সি ++ 11 অংশটি ভুল। আপনি constexprপ্রিপ্রোসেসর নির্দেশিকা থেকে ফাংশন (এমনকি ) কল করতে পারবেন না ।
ইন্টারজয়

8
এই ফ্ল্যাট-আউট ভুল উত্তর ইতিমধ্যে যে কেউ এটি উল্লেখ করেছে বিভ্রান্ত করেছে। আপনি প্রিপ্রোসেসর থেকে একটি কনস্টেক্সার ফাংশন কল করতে পারবেন না; অনুবাদ পর্ব until পর্যন্ত কনটেক্সপ্রপ কীওয়ার্ড হিসাবে স্বীকৃতি পায় না translation অনুবাদ পর্যায়ে প্রাক প্রসেসিং করা হয়
এইচ ওয়াল্টার্স

10

নিম্নলিখিত আমার জন্য ঝনঝন সঙ্গে কাজ করে। প্রতীকী ম্যাক্রো মান তুলনা হিসাবে যা প্রদর্শিত হয় তা অনুমতি দেয়। # অরর এক্সএক্সএক্সএক্স কেবল কম্পাইলার কী করে তা দেখার জন্য। প্রতিস্থাপন করা হচ্ছে বিড়াল সঙ্গে সংজ্ঞা # define বিড়াল (ক, খ) বি ## বিরতি জিনিস।

#define cat(a,...) cat_impl(a, __VA_ARGS__)
#define cat_impl(a,...) a ## __VA_ARGS__

#define xUSER_jack 0
#define xUSER_queen 1
#define USER_VAL cat(xUSER_,USER)

#define USER jack // jack or queen

#if USER_VAL==xUSER_jack
  #error USER=jack
  #define USER_VS "queen"
#elif USER_VAL==xUSER_queen
  #error USER=queen
  #define USER_VS "jack"
#endif

নিশ্চিত নয় যে এটি দুষ্ট, উজ্জ্বল বা উভয়ই ছিল তবে আমি এটির মতোই খুঁজছিলাম - ধন্যবাদ! আরও একটি সহায়ক কৌশলটি হল আপনার xUSER_ ম্যাক্রোগুলিকে 1 থেকে শুরু করে # সংজ্ঞায়িত করা USER তারপরে আপনি ইউএসএলটি এমন কোনও ঘটনায় ভুলভাবে সেট হয়ে গেছে যেখানে আপনি কীভাবে পরিচালনা করতে পারবেন না এমন কেসগুলি ধরার জন্য আপনি আপনার # সেলস তালিকার শেষের দিকে একটি # শর্ত যুক্ত করতে পারেন। (অন্যথায় আপনি যদি 0 থেকে সংখ্যা করেন তবে 0 কেসটি আপনার ক্যাচল হয়ে যায়, কারণ এটি পূর্বনির্ধারকের
অপরিজ্ঞাত

8

স্ট্রিংয়ের পরিবর্তে সংখ্যাসূচক মানগুলি ব্যবহার করুন।

অবশেষে ধ্রুবকদের জ্যাক বা কুইনকে স্ট্রিংয়ে রূপান্তর করতে স্ট্রিংকেজ (এবং / অথবা টোকানাইজ) অপারেটরগুলি ব্যবহার করুন।


2

ইতিমধ্যে উপরে বর্ণিত হিসাবে, আইএসও-সি 11 প্রিপ্রসেসর স্ট্রিং তুলনা সমর্থন করে না । তবে, "বিপরীত মান" দিয়ে ম্যাক্রো বরাদ্দের সমস্যাটি "টোকেন পেস্টিং" এবং "টেবিল অ্যাক্সেস" দিয়ে সমাধান করা যেতে পারে। জেসির সাধারণ কনটেনেট / স্ট্রিংফাই ম্যাক্রো-সলিউশন জিসিসি 5.4.0 এর সাথে ব্যর্থ হয় কারণ স্ট্রিংাইজেশন কনক্যাটেনটেশন (আইএসও সি 11 অনুসারে) মূল্যায়নের আগে করা হয়। তবে এটি স্থির করা যেতে পারে:

#define P_(user) user ## _VS
#define VS(user) P_ (user)
#define S(U) S_(U)
#define S_(U) #U

#define jack_VS  queen
#define queen_VS jack

S (VS (jack))
S (jack)
S (VS (queen))
S (queen)

#define USER jack          // jack    or queen, your choice
#define USER_VS USER##_VS  // jack_VS or queen_VS
S (USER)
S (USER_VS)

প্রথম লাইন (ম্যাক্রো P_()) পরবর্তী লাইনটি (ম্যাক্রো VS()) স্ট্রিংয়ের আগে কনকেন্টেশন শেষ করতে একটি দিকনির্দেশ যুক্ত করেছে (দেখুন ম্যাক্রোগুলির জন্য কেন আমার দ্বিখণ্ডের আবশ্যক ? )। স্ট্রিংাইজেশন ম্যাক্রোস ( S()এবং S_()) জেসি থেকে।

যদি টেবিলটি (ম্যাক্রোস jack_VSএবং queen_VS) অপেক্ষাকৃত অপারেটিংয়ের অন্য কোনও নির্মাণের চেয়ে জেসির থেকে রক্ষণাবেক্ষণ করা খুব সহজ।

শেষ অবধি, পরবর্তী চার-লাইনের ব্লকটি ফাংশন-স্টাইলের ম্যাক্রোগুলিকে অনুরোধ করে। শেষ চার-লাইনের ব্লকটি জেসির উত্তর থেকে।

কোডটি সংরক্ষণ করা foo.cএবং প্রিপ্রোসেসর gcc -nostdinc -E foo.cফলনকে অনুরোধ করা:

# 1 "foo.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "foo.c"
# 9 "foo.c"
"queen"
"jack"
"jack"
"queen"



"jack"
"USER_VS"

আশানুরূপ ফলাফল আউটপুট। শেষ লাইনটি অনুষ্ঠান USER_VSম্যাক্রো হয় না stringization সামনে প্রসারিত করা হয়েছে।


এই কাজ সুন্দরভাবে পর্যন্ত আমি আসলে চেষ্টা তুলনা উত্পন্ন স্ট্রিং, একটি শর্তাধীন সংকলন করতে: #if (S(USER)=="jack")- আমি একটি প্রাক প্রসেসর ত্রুটি ব্যবহার পেতে "- error: invalid token at start of a preprocessor expression
ysap

1

যদি আপনার স্ট্রিংগুলি সময় সংকীর্ণ হয় (যেমন আপনার ক্ষেত্রে থাকে) তবে আপনি নিম্নলিখিত কৌশলটি ব্যবহার করতে পারেন:

#define USER_JACK strcmp(USER, "jack")
#define USER_QUEEN strcmp(USER, "queen")
#if $USER_JACK == 0
#define USER_VS USER_QUEEN
#elif USER_QUEEN == 0
#define USER_VS USER_JACK
#endif

সংকলকটি strcmp এর ফলাফল আগেই বলতে পারে এবং তার ফলাফলের সাথে আরআরসিএমপি প্রতিস্থাপন করবে, এইভাবে আপনাকে এমন একটি # সংজ্ঞা প্রদান করবে যা প্রিপ্রোসেসর নির্দেশের সাথে তুলনা করা যায়। সংকলক বিকল্পগুলির উপর সংকলক / নির্ভরতার মধ্যে কোনও তফাত আছে কিনা তা আমি জানি না, তবে এটি আমার পক্ষে জিসিসি ৪.7.২ এ কাজ করেছে।

সম্পাদনা: আরও তদন্তের পরে, দেখে মনে হচ্ছে এটি কোনও সরঞ্জামচেন এক্সটেনশন, জিসিসি এক্সটেনশন নয়, তাই এটি বিবেচনায় রাখুন ...


7
এটি অবশ্যই স্ট্যান্ডার্ড সি নয় এবং এটি কোনও সংকলক দিয়ে কীভাবে কাজ করবে তা আমি দেখতে পাচ্ছি না। সংকলকটি মাঝে মাঝে এক্সপ্রেশনগুলির ফলাফল বলতে পারে (এমনকি ফাংশন কলগুলি, তারা যদি ইনলাইন হয় তবে), তবে প্রাক-প্রসেসর নয়। আপনার কি $কোনও প্রকার প্রসেসর এক্সটেনশনের ব্যবহার?
ugoren

4
দেখে মনে হচ্ছে এটি '#if $ USER_JACK == 0' সিনট্যাক্সটি কাজ করে, অন্তত জিএনইউ সি ++ এর সাথে নেটিভ অ্যান্ড্রয়েড কোড (জেএনআই) তৈরি করার জন্য ব্যবহৃত হয় ... আমি এটি জানতাম না, তবে এটি খুব দরকারী, আমাদের সম্পর্কে বলার জন্য আপনাকে ধন্যবাদ এটা!
গ্রেগকো

6
আমি এটি জিসিসি ৪.৯.১ এ চেষ্টা করে দেখেছি এবং আমি বিশ্বাস করি না এটি এটি করবে যা আপনার মনে হয় যা করে। কোডটি সংকলন করার সময় এটি আপনাকে প্রত্যাশিত ফলাফল দেবে না। '$' একটি পরিবর্তনশীল নাম হিসাবে বিবেচনা করা হয়। সুতরাং preprocessor, '$ USER_JACK' পরিবর্তনশীল জন্য খুঁজছেন না এটা খোঁজার & এটি 0. ডিফল্ট মান এভাবে দান, আপনি সবসময় USER_VS strcmp নির্বিশেষে USER_QUEEN হিসাবে সংজ্ঞায়িত করা হবে
Vitali

1

প্যাট্রিক এবং জেসি চিশলমের উত্তরগুলি আমাকে নিম্নলিখিতগুলি করতে বাধ্য করেছে:

#define QUEEN 'Q'
#define JACK 'J'

#define CHECK_QUEEN(s) (s==QUEEN)
#define CHECK_JACK(s) (s==JACK)

#define USER 'Q'

[... later on in code ...]

#if CHECK_QUEEN(USER)
  compile_queen_func();
#elif CHECK_JACK(USER)
  compile_jack_func();
#elif
#error "unknown user"
#endif

পরিবর্তে #define USER 'Q' #define USER QUEEN এছাড়াও কাজ করা উচিত কিন্তু পরীক্ষা করা হয়নি এছাড়াও কাজ করে এবং পরিচালনা করা সহজ হতে পারে।

সম্পাদনা: @ জিন-ফ্রানসোয়া ফ্যাব্রের মন্তব্য অনুসারে আমি আমার উত্তরটি মানিয়ে নিয়েছি।


পরিবর্তন (s==QUEEN?1:0)দ্বারা (s==QUEEN)আপনি তিন প্রয়োজন হবে না, ফলে ইতিমধ্যে একটি বুলিয়ান
জাঁ ফ্রাসোয়া Fabre

0
#define USER_IS(c0,c1,c2,c3,c4,c5,c6,c7,c8,c9)\
ch0==c0 && ch1==c1 && ch2==c2 && ch3==c3 && ch4==c4 && ch5==c5 && ch6==c6 && ch7==c7 ;

#define ch0 'j'
#define ch1 'a'
#define ch2 'c'
#define ch3 'k'

#if USER_IS('j','a','c','k',0,0,0,0)
#define USER_VS "queen"
#elif USER_IS('q','u','e','e','n',0,0,0)
#define USER_VS "jack"
#endif

এটি মূলত একটি স্থির দৈর্ঘ্যের স্থির চর অ্যারের পরিবর্তে ম্যানুয়ালি পরিবর্তিত দৈর্ঘ্যের স্থিতিশীল চর অ্যারের পরিবর্তে স্বয়ংক্রিয়ভাবে সর্বদা শেষ হওয়া নাল চরের সাথে শেষ হয়


0

আপনি এটি করতে পারবেন না যদি ব্যবহারকারীকে উদ্ধৃত স্ট্রিং হিসাবে সংজ্ঞায়িত করা হয়।

তবে আপনি এটি করতে পারেন যদি ব্যবহারকারী কেবল জ্যাক বা কুইন বা জোকার বা যা কিছু হয়।

ব্যবহারের জন্য দুটি কৌশল রয়েছে:

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

সুতরাং এর সাথে শুরু করা যাক:

#define JACK_QUEEN_OTHER(u) EXPANSION1(ReSeRvEd_, u, 1, 2, 3)

এখন, আমি যদি লিখি JACK_QUEEN_OTHER(USER)এবং ব্যবহারকারী জ্যাক, প্রিপ্রোসেসর এটিকে রূপান্তরিত করেEXPANSION1(ReSeRvEd_, JACK, 1, 2, 3)

দ্বিতীয় ধাপটি হ'ল:

#define EXPANSION1(a, b, c, d, e) EXPANSION2(a##b, c, d, e)

এখন JACK_QUEEN_OTHER(USER)হয়ে যায়EXPANSION2(ReSeRvEd_JACK, 1, 2, 3)

এটি স্ট্রিংয়ের সাথে মেলে কিনা তা অনুসারে বেশ কয়েকটি কমা যুক্ত করার সুযোগ দেয়:

#define ReSeRvEd_JACK x,x,x
#define ReSeRvEd_QUEEN x,x

যদি ব্যবহারকারী জ্যাক হয়, JACK_QUEEN_OTHER(USER)হয়ে যায়EXPANSION2(x,x,x, 1, 2, 3)

যদি ব্যবহারকারী কোয়েন হয়, JACK_QUEEN_OTHER(USER)হয়ে যায়EXPANSION2(x,x, 1, 2, 3)

যদি ব্যবহারকারী অন্য হয়, JACK_QUEEN_OTHER(USER)হয়ে যায়EXPANSION2(ReSeRvEd_other, 1, 2, 3)

এই মুহুর্তে, সমালোচনামূলক কিছু ঘটেছে: এক্সপ্যান্সন 2 ম্যাক্রোর চতুর্থ যুক্তিটি 1, 2, বা 3 হয়, মূল তর্কটি জ্যাক, রানী বা অন্য কিছু ছিল কিনা তার উপর নির্ভর করে। সুতরাং আমাদের যা করতে হবে তা হল এটি বাছাই। দীর্ঘ-বায়ুযুক্ত কারণে, আমাদের শেষ ধাপের জন্য দুটি ম্যাক্রোর প্রয়োজন হবে; যদিও এটি অপ্রয়োজনীয় বলে মনে হচ্ছে তবুও তারা এক্সপশন 2 এবং এক্সপেনশন 3 হবে।

সব কিছু একসাথে রেখে আমাদের কাছে এই 6 টি ম্যাক্রো রয়েছে:

#define JACK_QUEEN_OTHER(u) EXPANSION1(ReSeRvEd_, u, 1, 2, 3)
#define EXPANSION1(a, b, c, d, e) EXPANSION2(a##b, c, d, e)
#define EXPANSION2(a, b, c, d, ...) EXPANSION3(a, b, c, d)
#define EXPANSION3(a, b, c, d, ...) d
#define ReSeRvEd_JACK x,x,x
#define ReSeRvEd_QUEEN x,x

এবং আপনি তাদের এটি ব্যবহার করতে পারেন:

int main() {
#if JACK_QUEEN_OTHER(USER) == 1
  printf("Hello, Jack!\n");
#endif
#if JACK_QUEEN_OTHER(USER) == 2
  printf("Hello, Queen!\n");
#endif
#if JACK_QUEEN_OTHER(USER) == 3
  printf("Hello, who are you?\n");
#endif
}

বাধ্যতামূলক গডবোল্ট লিঙ্ক: https://godbolt.org/z/8WGa19


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