আমি কীভাবে একটি প্রিপ্রসেসর নির্দেশিকা দিয়ে ওএস পরীক্ষা করব?


195

অপারেটিং সিস্টেমের উপর ভিত্তি করে এটি সংকলিত হয় তার উপর ভিত্তি করে আমার বিভিন্ন কোড করতে আমার কোড দরকার। আমি এই জাতীয় কিছু খুঁজছি:

#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif

এই কাজ করতে একটি উপায় আছে কি? একই জিনিস করার আরও ভাল উপায় আছে?



8
@ কোরি ক্লিন: না-না এই প্রশ্নটি বহু বছর আগে জিজ্ঞাসা করা হয়েছিল
জন_ ওয়েস্ট

এটি প্রায় Cনয়C++
ইলগার

উত্তর:


290

পূর্বনির্ধারিত ম্যাক্রো OS এর জন্য সাইটের চেক একটি খুব সম্পূর্ণ তালিকা হয়েছে। তাদের কয়েকটি এখানে রয়েছে যেখানে তাদের লিঙ্ক রয়েছে:

উইন্ডোজ

_WIN32   32 বিট এবং 64 বিট
_WIN64   64 বিট উভয়ই

ইউনিক্স (লিনাক্স, * বিএসডি, ম্যাক ওএস এক্স)

এই চেকটি ব্যবহারের কিছু ক্ষতি সম্পর্কে এই সম্পর্কিত প্রশ্নটি দেখুন ।

unix
__unix
__unix__

ম্যাক ওএস এক্স

__APPLE__
__MACH__

উভয়ই সংজ্ঞায়িত; উভয় জন্য অনুসন্ধান করা কাজ করা উচিত।

লিনাক্স

__linux__
linux অপ্রচলিত (পসিক্স অনুগত নয়)
__linux অপ্রচলিত (POSIX অনুগত নয়)

FreeBSD 'র

__FreeBSD__

অ্যান্ড্রয়েড

__ANDROID__


1
প্রদত্ত এই সাইটটিতে আইওএস অন্তর্ভুক্ত নেই, সুতরাং এটি আইওএস এবং ওএস এক্সের মধ্যে পার্থক্য করতে সক্ষম হতে ব্যর্থ হয়েছে
গ্যারি মাকিন

2
ম্যাক ওএস সংজ্ঞা দেয় না __unix__। আপনি কেন এটি তালিকায় অন্তর্ভুক্ত করবেন?
ভিক্টর সার্জিয়েনকো

1
সিপিপি-ডিএম / দেব / নাল আপনাকে ইনস্টল করা জিসিসি-র সংস্করণে সমস্ত জিসিসি পূর্বনির্ধারিত ম্যাক্রোর একটি তালিকা দেবে
কাঠা

1
সাইগউইন unixপ্রতীকগুলি সংজ্ঞায়িত করে এবং সেগুলির সংজ্ঞা দেয় না win32, তাই সাবধান হন। এটিও সংজ্ঞায়িত করে __CYGWIN__
ডেভিড

হয় __linux__হিসাবে একই __ANDROID__??
দুপুরে

72

জিসিসি উইন্ডোজে সংজ্ঞায়িত করে:

gcc -dM -E - <NUL:

লিনাক্সে:

gcc -dM -E - </dev/null

MinGW এ পূর্বনির্ধারিত ম্যাক্রোগুলি:

WIN32 _WIN32 __WIN32 __WIN32__ __MINGW32__ WINNT __WINNT __WINNT__ _X86_ i386 __i386

ইউনিক্সে:

unix __unix__ __unix

1
উইন্ডোজ এবং ইউনিটগুলি কেবল ওএস নয়
ফুক্লভ

35

নাদিয়াসফটওয়্যার এবং ল্যাম্বদা পরীর উত্তরের উপর ভিত্তি করে ।

#include <stdio.h>

/**
 * Determination a platform of an operation system
 * Fully supported supported only GNU GCC/G++, partially on Clang/LLVM
 */

#if defined(_WIN32)
    #define PLATFORM_NAME "windows" // Windows
#elif defined(_WIN64)
    #define PLATFORM_NAME "windows" // Windows
#elif defined(__CYGWIN__) && !defined(_WIN32)
    #define PLATFORM_NAME "windows" // Windows (Cygwin POSIX under Microsoft Window)
#elif defined(__ANDROID__)
    #define PLATFORM_NAME "android" // Android (implies Linux, so it must come first)
#elif defined(__linux__)
    #define PLATFORM_NAME "linux" // Debian, Ubuntu, Gentoo, Fedora, openSUSE, RedHat, Centos and other
#elif defined(__unix__) || !defined(__APPLE__) && defined(__MACH__)
    #include <sys/param.h>
    #if defined(BSD)
        #define PLATFORM_NAME "bsd" // FreeBSD, NetBSD, OpenBSD, DragonFly BSD
    #endif
#elif defined(__hpux)
    #define PLATFORM_NAME "hp-ux" // HP-UX
#elif defined(_AIX)
    #define PLATFORM_NAME "aix" // IBM AIX
#elif defined(__APPLE__) && defined(__MACH__) // Apple OSX and iOS (Darwin)
    #include <TargetConditionals.h>
    #if TARGET_IPHONE_SIMULATOR == 1
        #define PLATFORM_NAME "ios" // Apple iOS
    #elif TARGET_OS_IPHONE == 1
        #define PLATFORM_NAME "ios" // Apple iOS
    #elif TARGET_OS_MAC == 1
        #define PLATFORM_NAME "osx" // Apple OSX
    #endif
#elif defined(__sun) && defined(__SVR4)
    #define PLATFORM_NAME "solaris" // Oracle Solaris, Open Indiana
#else
    #define PLATFORM_NAME NULL
#endif

// Return a name of platform, if determined, otherwise - an empty string
const char *get_platform_name() {
    return (PLATFORM_NAME == NULL) ? "" : PLATFORM_NAME;
}

int main(int argc, char *argv[]) {
    puts(get_platform_name());
    return 0;
}

জিসিসির সাথে পরীক্ষিত এবং ঝাঁকুনি:

  • দেবিয়ান 8
  • উইন্ডোজ (MinGW)
  • উইন্ডোজ (সাইগউইন)

প্রিয় @ এমডি এক্সএফ, দয়া করে আপনার উইন্ডোজ,
মিনজিডাব্লু

উইন্ডোজ 7 এন্টারপ্রাইজ 6.1.7601। সাইগউইন 2.7.0-1। আমি MinGW সংস্করণটি খুঁজে পাই না তবে আমি গতকাল এটি ডাউনলোড করেছি।
এমডি এক্সএফ

আপনাকে সম্ভবত সচেতন করা উচিত - এই প্রোগ্রামটি স্ট্যান্ডার্ড সি, সুতরাং এটি সমস্ত আনুগত্যমূলক সিস্টেমে কাজ করা উচিত।
এমডি এক্সএফ

প্রিয় @ এমডি এক্সএফ, এই তথ্যের জন্য আপনাকে ধন্যবাদ। এই উত্তরের উপরে আপনাকে অবদানকারী হিসাবে যুক্ত করেছি।
PADYMKO

10

বেশিরভাগ ক্ষেত্রে প্রদত্ত কার্যকারিতা উপস্থিত রয়েছে কি না তা যাচাই করা ভাল। উদাহরণস্বরূপ: যদি ফাংশনটি pipe()বিদ্যমান থাকে বা না থাকে।


3
কোনও ফাংশন সংজ্ঞায়িত করা আছে কিনা তা পরীক্ষা করার কোনও সহজ উপায় আছে?
হাইয়ালকি

1
আপনি যদি অটোকনফিগ ব্যবহার করছেন তবে আপনি AC_CHECK_FUNCS () এর সাথে ফাংশনগুলি পরীক্ষা করতে পারেন। AC_CHECK_FUNCS (পাইপ স্কয়ার্ট) ফাংশন উপলব্ধ থাকলে HAVE_PIPE এবং HAVE_SQRT সংজ্ঞায়িত করবে। অন্যান্য বিল্ডিং সরঞ্জামগুলির সাথে এটি কেমন তা আমি জানি না, তবে আমার ধারণা তারাও এটিকে একটি উপায়ে সমর্থন করে।
কুইনমার্স

@ এমডিএক্সএফ সি ++ 17 অনুসারে আছে __হস_সামহান। আমি মনে করি না এটি এখনও সি-তে মানসম্মত হয়েছে, তবে সমস্ত বড় সংকলক (জিসিসি, ক্ল্যাং, আইসিসি, এমএসভিসি) এটি বিক্রেতার-নির্দিষ্ট এক্সটেনশন হিসাবে এমনকি সি মোডে প্রয়োগ করে।
অ্যালাকারো


5

মাইক্রোসফ্ট সি / সি ++ সংকলক (এমএসভিসি) পূর্বনির্ধারিত ম্যাক্রোস এখানে পাওয়া যাবে

আমি মনে করি আপনি খুঁজছেন:

  • _WIN32- সংকলন লক্ষ্য 32-বিট এআরএম, 64-বিট এআরএম, x86, বা x64 হলে 1 হিসাবে সংজ্ঞায়িত। অন্যথায়, অপরিবর্তিত
  • _WIN64- সংকলন লক্ষ্য 64-বিট এআরএম বা x64 হলে 1 হিসাবে সংজ্ঞায়িত। অন্যথায়, অপরিবর্তিত

জিসিসি সংকলক প্রিডিফাইন্ড ম্যাক্রোগুলি এখানে পাওয়া যাবে

আমি মনে করি আপনি খুঁজছেন:

  • __GNUC__
  • __GNUC_MINOR__
  • __GNUC_PATCHLEVEL__

প্রাক-সংজ্ঞায়িত আপনার উপযুক্ত সংকলকগুলির জন্য একটি গুগল করুন।


4

সি স্ট্যান্ডার্ড অনুযায়ী সেট করা হয়নি এমন কোনও মানক ম্যাক্রো নেই। কিছু সি সংকলক কিছু প্ল্যাটফর্মগুলিতে একটি সেট করবে (উদাঃ অ্যাপলের প্যাচড জিসিসি এটি একটি অ্যাপল সিস্টেমে এবং ডারউইন প্ল্যাটফর্মের জন্য সংকলন করছে তা বোঝাতে একটি ম্যাক্রো সেট করে)। আপনার প্ল্যাটফর্ম এবং / অথবা আপনার সি সংকলক এছাড়াও কিছু সেট করতে পারে, তবে কোনও সাধারণ উপায় নেই।

হাইয়ালচি যেমন বলেছেন, আপনার বিল্ড প্রক্রিয়ায় কোনওভাবে এই ম্যাক্রোগুলি স্থাপন করা ভাল। কোড পরিবর্তন না করে বেশিরভাগ সংকলক সহ ম্যাক্রো সংজ্ঞায়িত করা সহজ। আপনি কেবল -D MACROজিসিসিতে পাস করতে পারেন , অর্থাৎ

gcc -D Windows
gcc -D UNIX

এবং আপনার কোডে:

#if defined(Windows)
// do some cool Windows stuff
#elif defined(UNIX)
// do some cool Unix stuff
#else
#    error Unsupported operating system
#endif

4

MinGW এ, _WIN32সংজ্ঞায়িত চেকটি কাজ করছে না। এখানে একটি সমাধান:

#if defined(_WIN32) || defined(__CYGWIN__)
    // Windows (x86 or x64)
    // ...
#elif defined(__linux__)
    // Linux
    // ...
#elif defined(__APPLE__) && defined(__MACH__)
    // Mac OS
    // ...
#elif defined(unix) || defined(__unix__) || defined(__unix)
    // Unix like OS
    // ...
#else
    #error Unknown environment!
#endif

আরও তথ্যের জন্য দয়া করে দেখুন: https://sourceforge.net/p/predef/wiki/ অপারেটিং সিস্টেম /


3
দুর্দান্ত লিঙ্ক। ---
এমডি এক্সএফ

2

ব্যবহার করুন #define OSsymbolএবং #ifdef OSsymbol যেখানে OSsymbol #defineআপনার টার্গেট ওএস সনাক্ত করতে সক্ষম 'প্রতীক।

সাধারণত আপনি নির্বাচিত ওএস প্রতীককে সংজ্ঞায়িত করে একটি কেন্দ্রীয় শিরোলেখ ফাইল অন্তর্ভুক্ত করবেন এবং সংকলন ও বিল্ড করতে ওএস-নির্দিষ্ট অন্তর্ভুক্ত এবং গ্রন্থাগার ডিরেক্টরি ব্যবহার করবেন।

আপনি আপনার বিকাশের পরিবেশ নির্দিষ্ট করতে পারেন নি তবে আমি নিশ্চিত যে আপনার সংকলকটি সাধারণ প্ল্যাটফর্ম এবং ওএসের জন্য বিশ্বব্যাপী সংজ্ঞা সরবরাহ করে।

Http://en.wikibooks.org/wiki/C_Programming/Preprocessor দেখুন


2

2

বাহ্যিক রেফারেন্সের জন্য দুঃখিত, তবে আমি মনে করি এটি আপনার প্রশ্নের পক্ষে উপযুক্ত:

সি / সি ++ টিপ: কম্পাইলার পূর্বনির্ধারিত ম্যাক্রোগুলি ব্যবহার করে কীভাবে অপারেটিং সিস্টেমের ধরণটি সনাক্ত করতে হয়


1
সেই মেটা পোস্ট সরানো হয়েছে। মজার বিষয় হল একটি মেটা পোস্ট মডারেশনের কারণে মুছে ফেলা পোস্টগুলি সম্পর্কে জিজ্ঞাসা করছে তা নিয়ন্ত্রণের কারণে সরিয়ে ফেলা হয়েছে।
এমডি এক্সএফ

হ্যাঁ। একেবারে পাগল
বুড়িউজ

2

আপনি Boost.Predefওএস ( BOOST_OS_*) সহ লক্ষ্য প্ল্যাটফর্মের জন্য বিভিন্ন পূর্বনির্ধারিত ম্যাক্রোগুলি ব্যবহার করতে পারেন । হ্যাঁ বুস্টকে প্রায়শই সি ++ লাইব্রেরি হিসাবে ভাবা হয় তবে এটি একটি প্রিপ্রসেসর হেডার যা সি এর সাথেও কাজ করে!

এই লাইব্রেরিটি সি, সি ++, অবজেক্টিভ সি, এবং অবজেক্টিভ সি ++ পূর্বনির্ধারিত ম্যাক্রোগুলি বা সাধারণভাবে উপলব্ধ শিরোনামগুলিতে সংজ্ঞায়িত তথ্য থেকে সংগ্রহকারী, আর্কিটেকচার, অপারেটিং সিস্টেম, গ্রন্থাগার এবং অন্যান্য সংস্করণ সংখ্যার একটি সেট সংজ্ঞায়িত করে। এই লাইব্রেরির ধারণাটি বুস্ট কনফিগার লাইব্রেরিটিকে সমর্থন করে বৈশিষ্ট্য সংজ্ঞাগুলির চেয়ে আরও বেশি এবং সামঞ্জস্যপূর্ণ তথ্য সরবরাহ করার প্রস্তাব উত্থাপনের প্রস্তাব থেকে উত্থিত হয়েছিল। নিম্নলিখিতটি হ'ল সংক্ষিপ্ত প্রস্তাবটির সম্পাদিত সংস্করণ।

উদাহরণ স্বরূপ

#include <boost/predef.h>

#if defined(BOOST_OS_WINDOWS)
#elif defined(BOOST_OS_ANDROID)
#elif defined(BOOST_OS_LINUX)
#elif defined(BOOST_OS_BSD)
#elif defined(BOOST_OS_AIX)
#elif defined(BOOST_OS_HAIKU)
...
#endif

অপারেটিং সিস্টেম ম্যাক্রোগুলিতে সম্পূর্ণ তালিকা পাওয়া যাবেBOOST_OS


1

আমি এখানে হাইকু সংজ্ঞা পাইনি । সম্পূর্ণ হওয়ার জন্য, হাইকু-ওস সংজ্ঞাটি সহজ__HAIKU__


0

কিছু সংকলকগুলি # নির্ধারণগুলি তৈরি করবে যা আপনাকে এটির সাথে সহায়তা করতে পারে। সংকলক ডকুমেন্টেশনগুলি সেগুলি নির্ধারণ করতে পড়ুন। এমএসভিসি এর একটি নির্ধারণ করে __WIN32__, জিসিসির সাথে আপনি দেখতে পারেন এমন কিছু রয়েছেtouch foo.h; gcc -dM foo.h


1
gcc: ত্রুটি: অজানা কমান্ড লাইন বিকল্প '- প্রদর্শন-সংজ্ঞায়িত' gcc: মারাত্মক ত্রুটি: কোনও ইনপুট ফাইল সংকলন সমাপ্ত হয়নি।
Sebi2020

0

সংকলনের সময় আপনি এই প্রোগ্রামটি চালানোর দরকার নেই কেবল এটি সংকলন করার জন্য প্রি-প্রসেসর নির্দেশাবলী সতর্কতা বা ত্রুটি হিসাবে ব্যবহার করতে পারেন ।

#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__)
    #error Windows_OS
#elif defined(__linux__)
    #error Linux_OS
#elif defined(__APPLE__) && defined(__MACH__)
    #error Mach_OS
#elif defined(unix) || defined(__unix__) || defined(__unix)
    #error Unix_OS
#else
    #error Unknown_OS
#endif

#include <stdio.h>
int main(void)
{
    return 0;
}

0

আপনি যে অপারেটিং সিস্টেমটি চালু করছেন তা পেতে আমি একটি ছোট লাইব্রেরি লিখেছি , এটি ক্লাইব (সি প্যাকেজ ম্যানেজার) ব্যবহার করে ইনস্টল করা যেতে পারে , সুতরাং এটি আপনার প্রকল্পগুলির নির্ভরতা হিসাবে ব্যবহার করা সত্যিই সহজ।

ইনস্টল করুন

$ clib install abranhe/os.c

ব্যবহার

#include <stdio.h>
#include "os.h"

int main()
{
    printf("%s\n", operating_system());
    // macOS
    return 0;
}

char*আপনি যে অপারেটিং সিস্টেমটি ব্যবহার করছেন তার নামের সাথে এটি একটি স্ট্রিং ( ) প্রদান করে, এই প্রকল্প সম্পর্কে আরও তথ্যের জন্য এটি গিথুবে নথিপত্র পরীক্ষা করে দেখুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.