HeadlinesBriefing HeadlinesBriefing.com

আপনার C স্ট্যান্ডার্ড C নয়

Hacker News •
×

স্ট্যান্ডার্ডে বর্ণিত C এবং glibc বা musl সহ gcc বা clang ব্যবহারকারীদের বাস্তবে ব্যবহৃত C-এর মধ্যে অসঙ্গতির একটি অসম্পূর্ণ তালিকা এখানে দেওয়া হলো।

ডিফল্টভাবে, gcc ও clang asm কীওয়ার্ডকে একটি এক্সটেনশন হিসেবে চিনে। স্ট্যান্ডার্ড C-তে asm একটি বৈধ, সংরক্ষিত নয় এমন শনাক্তকারী, তাই স্ট্যান্ডার্ড-অনুযায়ী কোড ডিফল্ট সেটিংসে কম্পাইল নাও হতে পারে। কম্পাইলারগুলো ডিফল্টভাবে কনফর্ম নয়, এবং স্ট্যান্ডার্ড C++-এর মতো asm-কে সংরক্ষিত শব্দ বানাতে পারত, যদিও তা করা হয়নি।

স্ট্যান্ডার্ড অনুযায়ী FLT_ROUNDS, <fenv.h>-এর fesetround-এর মাধ্যমে রানটাইমে রাউন্ডিং মোডের পরিবর্তনকে প্রতিফলিত করবে। তবে gcc রানটাইম রাউন্ডিং মোড যা-ই হোক না কেন, FLT_ROUNDS-কে সবসময় 1 (নিকটতমে রাউন্ড) হিসেবে সংজ্ঞায়িত করে। Clang __builtin_flt_rounds() নামে একটি বিল্টইন দেয়, কিন্তু gcc তা দেয় না।

C স্ট্যান্ডার্ড গাণিতিক আচরণ নিয়ন্ত্রণের জন্য ফ্লোটিং-পয়েন্ট প্র্যাগমা নির্দিষ্ট করে, যা C99 ও C23-এ যুক্ত হয়েছে। C99-এর ২৭ বছরেরও বেশি পরে, gcc এখনও এগুলোকে কোনো কাজ না করা (no-op) হিসেবে উপেক্ষা করে, এবং clang শুধু C99-এর প্র্যাগমা সমর্থন করে। কিছু কার্যকারিতা কমান্ড-লাইন ফ্ল্যাগ দিয়ে অনুকরণ করা যায়, কিন্তু সেগুলো পৃথক ফাংশন বা ব্লকের বদলে পুরো ট্রান্সলেশন ইউনিটে প্রযোজ্য হয়।

স্ট্যান্ডার্ড অনুযায়ী ফাংশনের রিটার্ন টাইপের কোয়ালিফায়ার বাদ দিতে হয়। তবে clang এগুলোকে গুরুত্বপূর্ণ হিসেবে বিবেচনা করে, তাই int f(); ও const int f(); একসঙ্গে ঘোষণা করলে টাইপ-সংঘর্ষের ত্রুটি দেখা দেয়, যদিও দুটি ঘোষণা একই হওয়ার কথা।

উৎস: Hacker News · সারাংশ: HeadlinesBriefing