স্ট্রোক আক্ষরিক হিসাবে ম্যাক্রো যুক্তিটি কীভাবে ব্যবহার করবেন?


91

আমি ম্যাক্রো কীভাবে লিখব তা জানার চেষ্টা করছি যা ভেরিয়েবলের সাথে একটি ভেরিয়েবলের সাথে একটি স্ট্রিং আক্ষরিক উপস্থাপনা উভয়কেই পাস করবে।

উদাহরণস্বরূপ নিম্নলিখিত ফাংশন দেওয়া।

void do_something(string name, int val)
{
   cout << name << ": " << val << endl;
}

আমি একটি ম্যাক্রো লিখতে চাই যাতে আমি এটি করতে পারি:

int my_val = 5;
CALL_DO_SOMETHING(my_val);

যা মুদ্রণ করবে: my_val: 5

আমি নিম্নলিখিতগুলি করার চেষ্টা করেছি:

#define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR);

তবে, আপনি অনুমান হিসাবে, উদ্ধৃতিগুলির ভিতরে থাকা VAR প্রতিস্থাপন হয় না, তবে কেবল স্ট্রিং আক্ষরিক "VAR" হিসাবে পাস করা হয়েছে। সুতরাং আমি জানতে চাই যে ম্যাক্রো আর্গুমেন্টটিকে স্ট্রিং আক্ষরিক মধ্যে রূপান্তরিত করার কোনও উপায় আছে কিনা।


আপনি এটি কীভাবে ব্যবহার করার চেষ্টা করছেন?
খ্রিস্ট

উত্তর:



28

আপনি স্ট্রিংাইজিং অপারেটরটি ব্যবহার করতে চান:

#define STRING(s) #s

int main()
{
    const char * cstr = STRING(abc); //cstr == "abc"
}

9

সম্ভবত আপনি এই সমাধান চেষ্টা করে দেখুন:

#define QUANTIDISCHI 6
#define QUDI(x) #x
#define QUdi(x) QUDI(x)
. . . 
. . .
unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n";

এটি কীভাবে প্রশ্নের উত্তর দেয় বা এটি কীভাবে সহায়ক?
jirigracik

4
@ জিরিগ্র্যাক - এটি অন্য উত্তরগুলির মত নয়, ম্যাক্রো সম্প্রসারণের স্ট্রিং উপস্থাপনাও পেতে দেয়
গ্রেপকেক

4
আমি মনে করি কেন কেবল ন্যায়সঙ্গত QUDI(x)হওয়া যথেষ্ট নয় তা ব্যাখ্যা করার জন্য এটি দরকারী হবে।
এলআরডিপিআরডিএক্স

8
#define NAME(x) printf("Hello " #x);
main(){
    NAME(Ian)
}
//will print: Hello Ian

আমি পুরোপুরি নিশ্চিত নই, তবে দেখে মনে হচ্ছে "Hello" #x"(এবং #x "Hello") স্থানটি ছাড়াই স্ট্রিংকে একসাথে আঠালো করে তোলে, যা কিছু ক্ষেত্রে পছন্দসই, তাই এটি মোটামুটি ভাল উত্তর।
স্মার

4
@ স্মার নিশ্চিত করুন আপনি ধ্রুব স্ট্রিংয়ের পরে কোনও স্থান রেখেছেন হ্যালো: "Hello " #x
জ্যাক

ঠিক আছে আমি তাই ভেবেছিলাম, আপনার উত্তরটিও সম্পাদনা করা উচিত কারণ এটি মূল্যবান তথ্য :)
স্মার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.