দুর্ভাগ্যক্রমে, ক্রস প্ল্যাটফর্মে, ক্রস সংকলক পরিবেশে, সংকলনের সময় বিশুদ্ধভাবে এটি করার কোনও একক নির্ভরযোগ্য পদ্ধতি নেই।
- _WIN32 এবং _WIN64 উভয়ই মাঝে মাঝে উভয়ই করতে পারে পারে, যদি প্রকল্পের সেটিংসটি ত্রুটিযুক্ত বা দূষিত হয় (বিশেষত ভিজ্যুয়াল স্টুডিও 2008 এসপি 1 তে)।
- একটি প্রকল্প কনফিগারেশন ত্রুটির কারণে "উইন 32" লেবেলযুক্ত একটি প্রকল্প 64-বিটে সেট করা যেতে পারে।
- ভিজ্যুয়াল স্টুডিও ২০০৮ এসপি 1-তে, অনেক সময় ইন্টেলিসেন্স বর্তমান # ডিফাইন অনুসারে কোডের সঠিক অংশগুলি ধূসর করে না। এটি সংকলনের সময় # ডিফাইনটি ঠিক কীভাবে ব্যবহৃত হচ্ছে তা দেখতে অসুবিধা হয়।
অতএব, একমাত্র নির্ভরযোগ্য পদ্ধতি হ'ল 3 টি সহজ চেক একত্রিত করা :
- 1) সংকলন সময় সেট , এবং;
- 2) রানটাইম চেক , এবং;
- 3) দৃust় সংকলন সময় চেক ।
সাধারণ চেক ১/৩: সময় নির্ধারণ করুন
প্রয়োজনীয় # ডিফাইন ভেরিয়েবল সেট করতে যে কোনও পদ্ধতি বেছে নিন । আমি @ জারেডপাড় থেকে পদ্ধতিটি পরামর্শ দিচ্ছি:
// Check windows
#if _WIN32 || _WIN64
#if _WIN64
#define ENV64BIT
#else
#define ENV32BIT
#endif
#endif
// Check GCC
#if __GNUC__
#if __x86_64__ || __ppc64__
#define ENV64BIT
#else
#define ENV32BIT
#endif
#endif
সাধারণ চেক 2/3: রানটাইম চেক
প্রধান () এ, মাপের () কোনও অর্থবোধ করে কিনা তা দেখতে ডাবল চেক করুন:
#if defined(ENV64BIT)
if (sizeof(void*) != 8)
{
wprintf(L"ENV64BIT: Error: pointer should be 8 bytes. Exiting.");
exit(0);
}
wprintf(L"Diagnostics: we are running in 64-bit mode.\n");
#elif defined (ENV32BIT)
if (sizeof(void*) != 4)
{
wprintf(L"ENV32BIT: Error: pointer should be 4 bytes. Exiting.");
exit(0);
}
wprintf(L"Diagnostics: we are running in 32-bit mode.\n");
#else
#error "Must define either ENV32BIT or ENV64BIT".
#endif
সরল চেক 3/3: শক্তিশালী সময় চেক
সাধারণ নিয়মটি হ'ল "প্রতিটি # ডেফাইন অবশ্যই একটি # টিতে শেষ হতে হবে যা একটি ত্রুটি উত্পন্ন করে"।
#if defined(ENV64BIT)
// 64-bit code here.
#elif defined (ENV32BIT)
// 32-bit code here.
#else
// INCREASE ROBUSTNESS. ALWAYS THROW AN ERROR ON THE ELSE.
// - What if I made a typo and checked for ENV6BIT instead of ENV64BIT?
// - What if both ENV64BIT and ENV32BIT are not defined?
// - What if project is corrupted, and _WIN64 and _WIN32 are not defined?
// - What if I didn't include the required header file?
// - What if I checked for _WIN32 first instead of second?
// (in Windows, both are defined in 64-bit, so this will break codebase)
// - What if the code has just been ported to a different OS?
// - What if there is an unknown unknown, not mentioned in this list so far?
// I'm only human, and the mistakes above would break the *entire* codebase.
#error "Must define either ENV32BIT or ENV64BIT"
#endif
আপডেট 2017-01-17
থেকে মন্তব্য @AI.G
:
4 বছর পরে (এটি আগে সম্ভব ছিল কিনা তা জানেন না) আপনি স্ট্যাটিক প্রতিস্থাপন ব্যবহার করে রান-টাইম চেকটি সংকলন-সময়কে রূপান্তর করতে পারেন: স্ট্যাটিক_সেসার্ট (মাপের (অকার্যকর *) == 4) ;. এখন এটি সমস্ত সংকলন সময়ে সম্পন্ন হয়েছে :)
অ্যাপেন্ডিক্স এ
অজ্ঞাতসারে, উপরের নিয়মগুলি আপনার পুরো কোডবেসটিকে আরও নির্ভরযোগ্য করে তুলতে অভিযোজিত হতে পারে:
- প্রতি যদি () বিবৃতিটি "অন্য" -এ শেষ হয় যা সতর্কতা বা ত্রুটি উত্পন্ন করে।
- প্রতিটি সুইচ () বিবৃতি একটি "ডিফল্ট:" এ শেষ হয় যা সতর্কতা বা ত্রুটি উত্পন্ন করে।
এটি ভালভাবে কাজ করার কারণটি হ'ল এটি আপনাকে প্রতি একক কেসটি আগে থেকেই ভাবতে বাধ্য করে এবং সঠিক কোডটি কার্যকর করতে "অন্য" অংশে (কখনও কখনও ত্রুটিযুক্ত) যুক্তির উপর নির্ভর না করে।
আমি এই কৌশলটি ব্যবহার করেছি (অনেকের মধ্যে) একটি 30,000 লাইনের প্রকল্পটি লিখতে যা প্রথম প্রযোজনায় স্থাপনের দিন থেকেই নির্দোষভাবে কাজ করেছিল (এটি ছিল 12 মাস আগে)।