প্রিপ্রসেসর নির্দেশিকায় ## (ডাবল হ্যাশ) কী করে?


91
#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;

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

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

FThreadSafeStaticStat কিছুটা টেমপ্লেটের মতো দেখতে লাগে তবে সেখানে # চলছে এবং এমন একটি বাক্য গঠন যা আমি আগে কখনও সি ++ এ দেখিনি #

কেউ আমাকে বলতে পারে এর অর্থ কী? আমি বুঝতে পারি যে আপনার অবাস্তব 4 এ অ্যাক্সেস নাও থাকতে পারে তবে এটি কেবলমাত্র বাক্য গঠন যা আমি বুঝতে পারি না।


6
আপনি অন্যান্য বিষয়গুলির মধ্যে সিপ্রেফারেন্সে ## অপারেটরটি পড়তে পারেন
— কুবিবি

4
##হয় / বলা যেতে পারে সংক্ষিপ্ত অপারেটর।
— ডায়প

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

4
structএকটি প্রবর্তন সম্প্রসারিত টাইপ সুনির্দিষ্টভাবে উল্লেখ করা যতটা আমি বলতে পারেন।
— ডায়াপ

4
অফিসিয়াল নামটি "টোকেন পেষ্টিং অপারেটর" কারণ এটি দুটি উত্পাদন করতে দুটি প্রিপ্রসেসিং টোকেনকে একত্রিত করে। মনে রাখবেন যে শুধুমাত্র বৈধ হলে ফলাফলের একটি বৈধ প্রাক-প্রক্রিয়াকরণ টোকেন হয়, যেমন আপনি ব্যবহার করতে পারবেন না + ## 3করতে +3। (তবে আপনি + 3অবশ্যই অপারেটর ছাড়াই করতে পারেন )
— এমএম

উত্তর:


175

## সংক্ষিপ্তকরণের জন্য প্রিপ্রোসেসর অপারেটর।

সুতরাং আপনি যদি ব্যবহার

DEFINE_STAT(foo)

কোডের যে কোনও জায়গায় এটির সাথে প্রতিস্থাপন হয়

struct FThreadSafeStaticStat<FStat_foo> StatPtr_foo;

আপনার কোড সংকলিত হওয়ার আগে।

এটি আরও ব্যাখ্যা করার জন্য আমার একটি ব্লগ পোস্টের আরও একটি উদাহরণ ।

#include <stdio.h>

#define decode(s,t,u,m,p,e,d) m ## s ## u ## t
#define begin decode(a,n,i,m,a,t,e)

int begin()
{
    printf("Stumped?\n");
}

এই প্রোগ্রামটি সফলভাবে সংকলন ও সম্পাদন করবে এবং নিম্নলিখিত আউটপুট উত্পাদন করবে:

Stumped?

যখন এই কোডটিতে প্রিপ্রসেসরটি আহ্বান করা হয়,

  • begin সঙ্গে প্রতিস্থাপন করা হয় decode(a,n,i,m,a,t,e)
  • decode(a,n,i,m,a,t,e) সঙ্গে প্রতিস্থাপন করা হয় m ## a ## i ## n
  • m ## a ## i ## n সঙ্গে প্রতিস্থাপন করা হয় main

এইভাবে কার্যকরভাবে, begin()প্রতিস্থাপন করা হয় main()।


8
## এর আচরণটি শিখতে আমি এতটা চিন্তা করার আশা করছিলাম না, তবে এখন আমার মনে হয় আমি কখনই এটি ভুলব না? সূতরাং ধন্যবাদ.
— নিকো বেরোগুরি

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