ডাবল স্ট্রিংয়ের কৌশলটি কীভাবে কাজ করবে?


84

কমপক্ষে কিছু সি প্রিপ্রোসেসর আপনাকে একটি ফাংশন-মতো ম্যাক্রোর মাধ্যমে অন্যটিকে স্ট্রাইনে রূপান্তর করে ম্যাক্রোর নামটির পরিবর্তে এর মানকে স্ট্রাইজ করতে দেয়:

উদাহরণ ব্যবহারের ক্ষেত্রে এখানে

এটি কমপক্ষে জিসিসি এবং কলংয়ে (উভয় সহ -std=c99) কাজ করে তবে আমি নিশ্চিত নই যে এটি সি-স্ট্যান্ডার্ড পদগুলিতে কীভাবে কাজ করে।

এই আচরণ কি গ্যারান্টিযুক্ত C99?
যদি তা হয় তবে সি 99 কীভাবে এটির গ্যারান্টি দেয়?
যদি তা না হয় তবে আচরণটি কোন সময়ে সি-সংজ্ঞায়িত থেকে জিসিসি-সংজ্ঞায়িত হয়?


4
আপনি যদি "কমপক্ষে কিছু" বলেন, তার মানে কি আপনি এমন কোনও জায়গা দেখেছেন যেখানে এটি কাজ করে না? আমি বিক্রেতাকে একটি বাগ রিপোর্ট লিখতে রাজি আছি।
জেনস

@ জেনস: না; আমি না। আমি যে প্রত্যেকটি সংকলক ব্যবহার করেছি (যথা, জিসিসি এবং কলং) এই আচরণটি প্রয়োগ করে।
পিটার হোসি

উত্তর:


80

হ্যাঁ, এটি গ্যারান্টিযুক্ত

এটি কাজ করে কারণ ম্যাক্রো আর্গুমেন্ট নিজেদের সামষ্টিক সম্প্রসারিত হয় ব্যতীত যেখানে ম্যাক্রো যুক্তি নামের সঙ্গে stringifier # বা টোকেন-paster ## ম্যাক্রো শরীর দেখা যায়।

6.10.3.1/1:

... একটি ফাংশন-জাতীয় ম্যাক্রোর অনুরোধের জন্য যুক্তিগুলি সনাক্ত করার পরে, যুক্তি প্রতিস্থাপন ঘটে। প্রতিস্থাপন তালিকার একটি প্যারামিটার, যদি না কোনও # বা ## প্রিপ্রসেসিং টোকেন বা ## প্রিপ্রসেসিং টোকেন (নীচে দেখুন) এর পরে না থাকে তবে এতে যুক্ত সমস্ত ম্যাক্রো প্রসারিত হওয়ার পরে সংশ্লিষ্ট যুক্তি দ্বারা প্রতিস্থাপন করা হবে ...

সুতরাং, আপনি যদি তা করেন STR1(THE_ANSWER)তবে আপনি "THE_ANSWER" পান, কারণ এসটিএল 1 এর যুক্তিটি ম্যাক্রো-প্রসারিত নয়। যাইহোক, STR2 আর্গুমেন্ট হয় ম্যাক্রো-প্রসারিত যখন এটি STR2 সংজ্ঞা, এবং একারণে STR1 একজন যুক্তি দেয় মধ্যে প্রতিস্থাপিত হচ্ছে 42, "42" এর ফলাফল নিয়ে।


21

স্টিভ নোট হিসাবে, এটি গ্যারান্টেড, এবং এটি C89 স্ট্যান্ডার্ডের পরে গ্যারান্টিযুক্ত হয়েছে - এটিই ছিল স্ট্যান্ডার্ড ম্যাক্রোস এবং ম্যান্ডেটের কোডেড # এবং # # অপারেটরগুলিকে দেহের মধ্যে প্রতিস্থাপনের আগে পুনরাবৃত্তভাবে ম্যাক্রোগুলিকে আর্কগুলিতে প্রসারিত করে যদি এবং শুধুমাত্র যদি শরীর যুক্তিতে # বা ## প্রয়োগ করে না । C99 এই ক্ষেত্রে সি 98 থেকে অপরিবর্তিত রয়েছে।


এটিও C89 এর অংশ বলে নিশ্চিত করার জন্য সময় দেওয়ার জন্য +1। আমাদের মধ্যে কিছু লোক পোর্টেবিলিটি সম্পর্কে যত্নশীল, কোড তৈরির সাথে সি সি ৯৮ মোডে সংকলনকারী লোকেরা ব্যবহার করতে পারে - কয়েক বছর আগে সিসি 89-তে জিসি রিলিজগুলি এখনও ডিফল্ট হয়েছিল (প্লাস জিসিসি এক্সটেনশনগুলি ন্যায্য হতে পারে), এমএসভিসি সর্বশেষে শুনেছি এখনও কেবল সি 89 সমর্থন করে, এবং এমবেডড বা লিগ্যাসি সিস্টেমগুলিতেও কখনও কখনও কেবলমাত্র C89 সংকলক থাকে। সি ৮৮ একটি দুর্দান্ত বহনযোগ্যতা "গ্রাউন্ড ফ্লোর" তৈরি করে, একটি সর্বনিম্ন সাধারণ ডিনোমিনেটর স্ট্যান্ডার্ড যা লোকেরা আজ ব্যবহারিক ব্যবহারের জন্য যেকোন কিছু সংকলন করতে এবং চালনা করতে লক্ষ্য করতে পারে। সুতরাং এটি মনে আছে দেখতে খুব সুন্দর।
mtraceur
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.