সি প্রিপ্রসেসর ব্যবহার করে স্ট্রিং-এ কনটেনেট ইন্ট


90

আমি সি প্রিপ্রোসেসর ব্যবহার করে কীভাবে আমি #define'ডি ইন্ট টু #define' ডি স্ট্রিংটি যুক্ত করতে পারি তা জানার চেষ্টা করছি । আমার সংকলকটি সেন্টস 5 এ জিসিসি 4.1, সমাধানটি মিনিজিডাব্লুয়ের জন্যও কাজ করা উচিত।

আমি একটি স্ট্রিংয়ে একটি সংস্করণ নম্বর সংযোজন করতে চাই, তবে আমি এটির কাজটি করতে পারার একমাত্র উপায় হ'ল স্ট্রিং হিসাবে সংজ্ঞায়িত সংস্করণ নম্বরটির একটি অনুলিপি তৈরি করা।

সর্বনিকটবর্তী বস্তু আমি খুঁজে পাইনি ম্যাক্রো আর্গুমেন্ট উদ্ধৃত একটি পদ্ধতি ছিল, কিন্তু তার জন্য কাজ করে না #defineগুলি

এটি কাজ করে না।

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER

এটি আর ছাড়াই কাজ করে না #কারণ মানগুলি সংখ্যা হয় এবং এটি প্রসারিত হবে "/home/user/.myapp" 2 6, যা বৈধ সি নয় ।

এটি কাজ করে, তবে সংস্করণ সংজ্ঞায়িত করা অনুলিপিগুলি থাকা আমার পছন্দ নয় কারণ সংখ্যার পাশাপাশি আমারও তাদের প্রয়োজন।

#define MAJOR_VER 2
#define MINOR_VER 6
#define MAJOR_VER_STR "2"
#define MINOR_VER_STR "6"
#define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING

উত্তর:


172

ধ্রুপদী সি প্রিপ্রসেসর প্রশ্ন ....

#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" STR(MAJOR_VER) STR(MINOR_VER)

ইন্ডিয়ারেশনের অতিরিক্ত স্তরের প্রিপ্রসেসর ম্যাক্রোগুলিকে স্ট্রিংয়ে রূপান্তরিত করার আগে তাদের প্রসারিত করার অনুমতি দেবে।


4
এই ক্ষেত্রে এসটিআর () একটি সংকীর্ণ স্ট্রিং দেবে। এটিকে একটি বিস্তৃত স্ট্রিংয়ে রূপান্তর করার জন্য কি কোনও প্রকরণ রয়েছে?
gkns

4
আমি কতবার এটি গুগল করেছিলাম এবং এই সঠিক উত্তরটি অনুলিপি করতে পারি তা বলতে পারিনি, তবে এটি দ্বিগুণে থাকবে
মাইটিপোর্ক

4
প্রথম "স্টাটহেল্পার" প্রয়োজন কারণ '#' শুধুমাত্র একটি ম্যাক্রো যুক্তি দিয়ে কাজ করে। এটা বুঝতে আমার কিছুটা সময় লেগেছে ..
ক্লার্কট্টফু

4
@ ক্লার্কট্টফু, ধরণের - হ্যাঁ, #কেবল ম্যাক্রো যুক্তি দিয়ে কাজ করে। তবে STR_HELPERম্যাক্রোটিকে MAJOR_VERস্ট্রিংয়ে রূপান্তর করা এড়ানোর জন্য ম্যাক্রোর প্রয়োজন "MAJOR_VAR", আমরা যে ফলাফলটি পেতে চাই "2"
লিন্ডাইড্যান্সার

13

কাজের উপায় হ'ল প্যারামেট্রিক ম্যাক্রো হিসাবে এমওয়াই_ফাইল লিখুন:

#define MY_FILE(x,y) "/home..." #x #y

সম্পাদনা: "লিন্ডাইড্যান্সার" দ্বারা উল্লিখিত হিসাবে, এই সমাধানটি আর্গুমেন্টগুলিতে ম্যাক্রোগুলিকে প্রসারিত করে না। আরও সাধারণ সমাধান হ'ল:

#define MY_FILE_(x,y) "/home..." #x #y
#define MY_FILE(x,y) MY_FILE_(x,y)

4
আমার সৎ মতামতে, এটি সেরা উত্তর, এবং অন্যান্য পরামর্শের তুলনায় অনেক সহজ। আমি অবাক হয়েছি এটি আরও ভাল রেটিং পায় না!
ওসিরিগোথর

4
এটি একটি পরিষ্কার সমাধান যা দুর্ভাগ্যক্রমে কার্যকর হয় না। যদি আর্গুমেন্টটি MY_FILEম্যাক্রো হয় তবে বলুন Aএবং B, এই ম্যাক্রো প্রসারিত হবে "/home..." "A" "B"
লিন্ডাইড্যান্সার

2

আপনি এটি BOOST_PP_STRINGIZE দিয়ে করতে পারেন :

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" BOOST_PP_STRINGIZE(MAJOR_VER) BOOST_PP_STRINGIZE(MINOR_VER)

28
লোকে কীভাবে সমস্ত কিছু বুস্টকে ফেলে দেয় তা আমাকে মাতাল করে তোলে।
ফ্রেরিচ রাবাবে

4
@ ফ্রেরিচ: আপনার তর্ককে চূড়ান্ত দিকে নিয়ে যাওয়ার জন্য, লোকেরা সমস্ত কিছুর উপর g ++ নিক্ষেপ না করে কাঁচা মেশিন কোডে প্রথমে তাদের নিজস্ব সংকলক লিখতে হবে ... চাকাটি পুনরায় উদ্দীপনার কোনও অর্থ নেই। ভাল প্রোগ্রামাররা কোড লেখেন, দুর্দান্তগুলি পুনরায় ব্যবহার করুন।
ম্যাক্সিম এগারুশকিন

@ জোন্সকবি: কেবলমাত্র বুস্ট শিরোনামটি খুলুন এবং নিজের জন্য দেখুন।
ম্যাক্সিম এগুরুশকিন

10
হ্যাঁ, আমি চেষ্টা করেছিলাম। এটি কাজ করেছিল, তবে একটি সি প্রোগ্রামে বুস্ট শিরোনামটি ব্যবহার করা আমার কাছে একরকম অদ্ভুত বলে মনে হয়।
jonescb

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