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


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.