সামান্য ভিন্ন প্রয়োজন: কোড নির্বাহ না করেই কম্পাইল টার্গেট মেশিনটি বিট বা সামান্য এন্ডিয়ান কিনা তা নির্ধারণ করতে আমার একটি প্রোগ্রাম বিল্ড কনফিগার স্ক্রিপ্টে এর মতো একটি পরীক্ষা প্রয়োজন । স্ক্রিপ্ট অবশ্যই একটি শিরোনামে জমা দিতে হবে , অন্যথায় ।#define HAVE_LITTLE_ENDIAN 1
config.h
#define HAVE_LITTLE_ENDIAN 0
সংকলন লক্ষ্য মেশিনটি বিল্ড মেশিনের থেকে আলাদা হতে পারে, যেহেতু আমরা ক্রস-সংকলন করতে পারি, যা এটি ব্যাখ্যা করে যে পরীক্ষার কেন কোনও সংকলিত কোড চালানোর চেষ্টা করা উচিত নয়। printf
উত্তরটি ছাড়িয়ে যায় এমন একটি বিবৃতি সহ একটি সামান্য সি প্রোগ্রাম থাকা প্রশ্নের বাইরে নয়।
সম্ভাব্য সমাধান হ'ল এটি। আমরা একটি ফাইল তৈরি করি conftest.c
যার নাম রয়েছে:
#define USPELL(C0, C1, C2, C3) \
((unsigned) C0 << 24 | \
(unsigned) C1 << 16 | \
(unsigned) C2 << 8 | (unsigned) C3)
unsigned x[6] = {
0,
USPELL('L', 'I', 'S', 'P'),
USPELL('U', 'N', 'I', 'X'),
USPELL('C', 'O', 'R', 'E'),
USPELL('D', 'W', 'I', 'M'),
0
};
এখন, আমরা এটি conftest.o
ব্যবহার করে সংকলন :
$ /path/to/cross-compiling/cc conftest.c -c
তারপরে আমরা চালাব:
$ strings conftest.o
PSILXINUEROCMIWD
যদি স্ট্রিংটি PSILXINUEROCMIWD
ঘটে, লক্ষ্যটি সামান্য-এডিয়ান। যদি স্ট্রিংটি LISPUNIXCOREDWIM
ঘটে তবে এটি বড়-এন্ডিয়ান। যদি স্ট্রিং না ঘটে বা আরও আশ্চর্যজনকভাবে উভয়ই ঘটে তবে পরীক্ষা ব্যর্থ হয়েছে।
এই পদ্ধতিটি কাজ করে কারণ প্রোগ্রামে গণনা করা "ফোরসিসি" ধ্রুবকের মেশিন-স্বতন্ত্র মান রয়েছে, সমাপ্তি নির্বিশেষে একই পূর্ণসংখ্যাকে বোঝায়। বস্তুর ফাইলে তাদের স্টোরেজ উপস্থাপনা লক্ষ্য সিস্টেমের endianness অনুসরণ করে, এবং যে অধীন চরিত্র ভিত্তিক দৃশ্য মাধ্যমে দৃশ্যমান strings
।
দুটি শূন্য রক্ষাকারী শব্দটি নিশ্চিত করে যে স্ট্রিংটি বিচ্ছিন্ন। এটি কঠোরভাবে প্রয়োজনীয় নয়, তবে এটি নিশ্চিত করে যে আমরা যে স্ট্রিংটির সন্ধান করছি সেগুলি অন্য কোনও স্ট্রিংয়ে এম্বেড করা হয়নি, যার অর্থ strings
এটি নিজেই একটি লাইনে আউটপুট তৈরি করবে।
পিএস USPELL
ম্যাক্রো যুক্তি সন্নিবেশগুলিকে বন্ধনীয় করে না কারণ এটি এই নির্দিষ্ট উদ্দেশ্যে তৈরি করা হয়েছে, পুনরায় ব্যবহারের জন্য নয়।