ঠিক আছে, আমি যথেষ্ট অবাক হয়েছি যে এই বাক্য গঠনের বিকল্পগুলির উল্লেখ করা হয়নি। অন্য একটি সাধারণ (তবে পুরানো) মেকানিজম হ'ল এমন ফাংশনটি কল করা যা সংজ্ঞায়িত নয় এবং আপনার দৃ as়তা সঠিক হলে ফাংশন কলটি সংকলন করতে অপ্টিমাইজারের উপর নির্ভর করে।
#define MY_COMPILETIME_ASSERT(test) \
do { \
extern void you_did_something_bad(void); \
if (!(test)) \
you_did_something_bad(void); \
} while (0)
এই প্রক্রিয়াটি যখন কাজ করে (অপ্টিমাইজেশানগুলি সক্ষম থাকে ততক্ষণ) আপনার লিঙ্ক না করা পর্যন্ত ত্রুটিটি না জানানো এর নেতিবাচক দিক রয়েছে, যে সময়ে আপনি_did_something_bad () ফাংশনের সংজ্ঞাটি খুঁজে পেতে ব্যর্থ হন। এ কারণেই কার্নেল বিকাশকারীরা নেতিবাচক আকারের বিট-ফিল্ড প্রস্থ এবং নেতিবাচক আকারের অ্যারেগুলির (যেমন পরে জিসিসি ৪.৪-এ বিল্ডিং বন্ধ করে দিয়েছিল) কৌশলগুলি ব্যবহার শুরু করে।
সংকলন-সময়ের দাবিগুলির প্রয়োজনীয়তার প্রতি সহানুভূতিতে, জিসিসি 4.3 error
ফাংশন বৈশিষ্ট্যটি প্রবর্তন করে যা আপনাকে এই পুরানো ধারণাটি প্রসারিত করতে দেয়, তবে আপনার নির্বাচনের বার্তা সহ একটি সংকলন-সময় ত্রুটি তৈরি করে - আর কোনও গুপ্ত "নেতিবাচক আকারের অ্যারে" না " ভুল বার্তা!
#define MAKE_SURE_THIS_IS_FIVE(number) \
do { \
extern void this_isnt_five(void) __attribute__((error( \
"I asked for five and you gave me " #number))); \
if ((number) != 5) \
this_isnt_five(); \
} while (0)
প্রকৃতপক্ষে, লিনাক্স ৩.৯ হিসাবে, আমাদের এখন একটি ম্যাক্রো বলা হয়েছে compiletime_assert
যা এই বৈশিষ্ট্যটি ব্যবহার করে এবং বেশিরভাগ ম্যাক্রোগুলি bug.h
সেই অনুযায়ী আপডেট করা হয়েছে। তবুও, এই ম্যাক্রোটি আরম্ভকারী হিসাবে ব্যবহার করা যাবে না। তবে স্টেটমেন্ট এক্সপ্রেশন (অন্য একটি জিসিসির সি-এক্সটেনশন) ব্যবহার করে আপনি পারবেন!
#define ANY_NUMBER_BUT_FIVE(number) \
({ \
typeof(number) n = (number); \
extern void this_number_is_five(void) __attribute__(( \
error("I told you not to give me a five!"))); \
if (n == 5) \
this_number_is_five(); \
n; \
})
এই ম্যাক্রো তার প্যারামিটারটি একবারে মূল্যায়ন করবে (যদি এর পার্শ্ব-প্রতিক্রিয়া থাকে তবে) এবং একটি সংকলন-সময় ত্রুটি তৈরি করবে যা বলেছিল "আমি আপনাকে পাঁচটি না দেওয়ার জন্য বলেছিলাম!" যদি অভিব্যক্তিটি পাঁচটিতে মূল্যায়ন করে বা সংকলন-ধ্রুবক না হয়।
তাহলে আমরা কেন এটি নেতিবাচক আকারের বিট-ফিল্ডগুলির পরিবর্তে ব্যবহার করছি না? হায়, বিবৃতি প্রকাশের সম্পূর্ণরূপে ধ্রুবক থাকলেও স্টেটমেন্ট এক্সপ্রেশনার্স (এনাম কনস্ট্যান্টস, বিট-ফিল্ড প্রস্থ ইত্যাদির জন্য) হিসাবে স্টেটমেন্ট এক্সপ্রেশনগুলির ব্যবহারের অনেকগুলি বিধিনিষেধ রয়েছে (যেমন, সম্পূর্ণ মূল্যায়ন করা যেতে পারে সংকলন সময়ে এবং অন্যথায় __builtin_constant_p()
পরীক্ষা পাস )। আরও, এগুলি কোনও ফাংশন বডির বাইরে ব্যবহার করা যায় না।
আশা করি, জিসি শীঘ্রই এই ত্রুটিগুলি সংশোধন করবে এবং ধ্রুব বিবৃতি প্রকাশকে ধ্রুবক আরম্ভকারী হিসাবে ব্যবহার করার অনুমতি দেবে। এখানে চ্যালেঞ্জটি হ'ল একটি আইনী ধ্রুবক প্রকাশ কী তা নির্ধারণ করে ভাষা নির্দিষ্টকরণ। সি ++ 11 কেবলমাত্র এই ধরণের বা জিনিসের জন্য কনটেক্সারপ কীওয়ার্ড যুক্ত করেছে, তবে সি 11 তে কোনও প্রতিরূপ বিদ্যমান নেই। যদিও সি 11 স্থিতিশীল দাবিগুলি পেয়েছিল, যা এই সমস্যার অংশটি সমাধান করবে, এটি এই সমস্ত ত্রুটিগুলি সমাধান করবে না। সুতরাং আমি আশা করি যে জিসিসি একটি-এক্সটেনশন হিসাবে -std = gnuc99 & -std = gnuc11 বা এরকম কিছু এর মাধ্যমে একটি কনস্টেক্সপ্র্যাপ কার্যকারিতা উপলব্ধ করতে পারে এবং বিবৃতি এক্সপ্রেশন ইত্যাদিতে এর ব্যবহারকে মঞ্জুরি দেয়। অল।