পুরানো দিনগুলিতে (প্রাক-এএনএসআই) পূর্বনির্ধারিত প্রতীকগুলি unix
এবং vax
কোডটি সংকলন করার সময় এটি কী সিস্টেমের জন্য সংকলিত হচ্ছে তা সনাক্ত করার একটি উপায় ছিল। এর আগে আর কোনও অফিসিয়াল ভাষার মান ছিল না (কে অ্যান্ড আর এর প্রথম সংস্করণের পিছনে রেফারেন্স উপাদানের বাইরে), এবং কোনও জটিলতার সি কোড সাধারণত #ifdef
সিস্টেমের মধ্যে পার্থক্যের জন্য এক জটিল ধাঁধা ছিল । এই ম্যাক্রো সংজ্ঞাগুলি সাধারণত সংকলক নিজেই সেট করেছিলেন, কোনও লাইব্রেরির শিরোনাম ফাইলে সংজ্ঞায়িত হয়নি। যেহেতু বাস্তবায়নের মাধ্যমে সনাক্তকারীগুলি ব্যবহার করা যেতে পারে এবং যা প্রোগ্রামারদের জন্য সংরক্ষিত ছিল সে সম্পর্কে কোনও সত্যিকারের নিয়ম নেই, সংকলক লেখকরা সাধারণ নামগুলির মতো নির্দ্বিধায় অনুভব করেছিলেন unix
এবং ধরে নিয়েছিলেন যে প্রোগ্রামাররা কেবল তাদের নিজস্ব উদ্দেশ্যে এই নামগুলি ব্যবহার করা এড়াতে পারবেন।
1989 এএনএসআই সি স্ট্যান্ডার্ড প্রয়োগগুলি আইনীভাবে পূর্বনির্ধারিত করতে পারে এমন প্রতীকগুলিকে সীমাবদ্ধ করে এমন নিয়ম চালু করেছিল introduced সংকলক দ্বারা পূর্বনির্ধারিত একটি ম্যাক্রোর কেবলমাত্র দুটি আন্ডারস্কোর দিয়ে শুরু হওয়া নাম বা আন্ডারস্কোরের পরে বড় হাতের অক্ষর দিয়ে নাম থাকতে পারে, প্রোগ্রামাররা সেই প্যাটার্নটির সাথে মেলে না এবং সনাক্তকারী সনাক্ত করতে ব্যবহারের জন্য মুক্ত রাখেন এবং স্ট্যান্ডার্ড লাইব্রেরিতে ব্যবহৃত হয় না।
ফলস্বরূপ, কোনও সংকলক যা পূর্বনির্ধারিত unix
বা linux
অ-অনুসরনীয়, কারণ এটি পুরোপুরি আইনী কোড যা এই জাতীয় কিছু ব্যবহার করে তা সংকলন করতে ব্যর্থ হবে int linux = 5;
।
যেমনটি ঘটে, জিসিসি ডিফল্টরূপে মেনে চলছে না - তবে এটি ডান কমান্ড-লাইন অপশনগুলির সাথে উপযুক্তভাবে (যুক্তিসঙ্গতভাবে ভাল) তৈরি করা যেতে পারে:
gcc -std=c90 -pedantic ... # or -std=c89 or -ansi
gcc -std=c99 -pedantic
gcc -std=c11 -pedantic
দেখুন জিসিসি ম্যানুয়াল আরো বিস্তারিত জানার জন্য।
জিসিসি ভবিষ্যতে প্রকাশে এই সংজ্ঞাগুলি পর্যালোচনা করবে, সুতরাং আপনার উপর নির্ভর করে এমন কোনও কোড লিখবেন না। আপনার প্রোগ্রামটি যদি লিনাক্স টার্গেটের জন্য সংকলিত হচ্ছে কিনা তা __linux__
যদি জানতে হয় তবে এটি নির্ধারিত কিনা তা পরীক্ষা করে দেখতে পারে (ধরে নিই আপনি জিসিসি বা এর সাথে সামঞ্জস্যপূর্ণ একটি সংকলক ব্যবহার করছেন)। দেখুন গনুহ সি প্রাক প্রসেসর ম্যানুয়াল আরও তথ্যের জন্য।
মূলত অপ্রাসঙ্গিকভাবে একদিকে: ১৯৮7 সালের আন্তর্জাতিক ওফসকেটেড সি কোড কনটেস্টের "সেরা ওয়ান লাইনার" বিজয়ী , ডেভিড কর্ন (হ্যাঁ, কর্ন শেলের লেখক) পূর্বনির্ধারিত unix
ম্যাক্রোর সুযোগ নিয়েছিলেন :
main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
এটি মুদ্রণ করে "unix"
তবে ম্যাক্রো নামের বানানের সাথে একেবারে কোনও যোগসূত্র নেই for