প্রিপ্রোসেসর ম্যাক্রোগুলি থেকে প্ল্যাটফর্ম / সংকলক কীভাবে সনাক্ত করবেন?


115

আমি একটি ক্রস প্ল্যাটফর্ম কোড লিখছি, যা লিনাক্স, উইন্ডোজ, ম্যাক ওএসে সংকলন করা উচিত। উইন্ডোজগুলিতে, আমাকে অবশ্যই ভিজ্যুয়াল স্টুডিও এবং মিংডাব্লু সমর্থন করতে হবে।

প্ল্যাটফর্ম-নির্দিষ্ট কোডের কয়েকটি টুকরা রয়েছে, যা আমার #ifdef .. #endifপরিবেশে রাখা উচিত । উদাহরণস্বরূপ, আমি এখানে win32 নির্দিষ্ট কোড রেখেছি:

#ifdef WIN32
#include <windows.h>
#endif

তবে আমি কীভাবে লিনাক্স এবং ম্যাক ওএসকে চিনতে পারি? নামগুলি (বা ইত্যাদি) কীভাবে ব্যবহার করা উচিত?



ডুপের আরও অনেক ভাল গ্রহণযোগ্য উত্তর রয়েছে।
রুবেনভ

1
প্রস্তাবিত সদৃশ একই প্রশ্ন নয়। এই প্রশ্নটি কেবল অপারেটিং সিস্টেম সনাক্তকরণ সম্পর্কে জিজ্ঞাসা করে, যেখানে এই প্রশ্নটি সংকলক সনাক্তকরণ সম্পর্কেও জিজ্ঞাসা করে, যা একটি খুব আলাদা জিনিস।
জেবেেন্টলি

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

1
@ রুবেনভব তারপরে অন্য প্রশ্নের সাথে একটি মন্তব্য হিসাবে যুক্ত করুন। কেবলমাত্র এর আরও ভাল উত্তর রয়েছে বলে এটি এটিকে সদৃশ করে না। এটি উত্তরগুলি নয়, এটি কোনও সদৃশ কিনা তা নির্ধারণ করে। এটির সমাপ্তি কেবলমাত্র নিশ্চিত করে যে আমরা প্রশ্নের সংকলক-সম্পর্কিত অংশটির জন্য কোনও ভাল মানের উত্তর পাই না, যা তথাকথিত "সদৃশ" কখনও উত্তর দিতে পারে না।
জেবেেন্টলি

উত্তর:


133

জন্য ম্যাক OS :

#ifdef __APPLE__

উইন্ডোজে মিংডাব্লুয়ের জন্য :

#ifdef __MINGW32__

জন্য লিনাক্স :

#ifdef __linux__

অন্যান্য Windows কম্পাইলার জন্য, চেক এই থ্রেড এবং এই বেশ কয়েকটি কম্পাইলার ও আর্কিটেকচার জন্য।


2
না __APPLE__ওএসএক্স এবং iOS মধ্যে পার্থক্য?
gman

14
__APPLE__ওএস এক্স এবং আইওএস উভয়ের জন্য সেট করা আছে। আপনি #include <TargetConditionals.h>ভিতরে যেতে পারেন #ifdef __APPLE__, যা আপনাকে একটি দেয় TARGET_OS_IPHONE #define
টেড মাইলকজারেক

2
__MINGW64__যখন কেউ মিংডব্লিউ 64 ব্যবহার করে
স্কোন করে

2
যেহেতু __MINGW64__রেফারেন্সযুক্ত তাই _MSC_VERউইন্ডোজ / এমএসভিসির জন্য মনে রাখার মতো মূল্য রয়েছে (যা এমএসভিসি সংস্করণ পরীক্ষা করতেও ব্যবহৃত হতে পারে)।
ধারণাগুলি 42

আমি দুঃখিত, তবে এই উত্তরটি সমস্ত অ্যাকাউন্টে বেশ ভুল এবং এমনকি প্রশ্নের উত্তর দেয় না।
রুবেনভিবি

59

দেখুন: http://predef.sourceforge.net/index.php

এই প্রকল্পটি #definesঅনেক অপারেটিং সিস্টেম, সংকলক, ভাষা এবং প্ল্যাটফর্মের মান এবং স্ট্যান্ডার্ড লাইব্রেরির জন্য পূর্বনির্ধারিত একটি যুক্তিসঙ্গতভাবে ব্যাপক তালিকা সরবরাহ করে।


5
1.55 সংস্করণ অনুসারে, প্রিডাফ এখন বুস্ট সি ++ লাইব্রেরিতে অন্তর্ভুক্ত রয়েছে ।
মূল্য

আমি জানি আপনি যখন এটি পোস্ট করেছিলেন তখন বিধিগুলি আলাদা ছিল, তবে আমি আপনাকে আরও প্রাসঙ্গিক বিবরণ অন্তর্ভুক্ত করার জন্য এই পোস্টটি সম্পাদনা করতে বলব। এখন একটি দিনের লিংক কেবল উত্তরগুলি দৃ strongly়ভাবে নিরুৎসাহিত করা হয়েছে, এবং আমি আপনাকে পোস্টটি অপসারণের আগে এটি সংরক্ষণ করার সুযোগ দিতে চাই।
মিক ম্যাককালাম

1
যেহেতু এটিই কেবলমাত্র উত্তর যা শিরোনামে বর্ণিত প্রশ্নটি আসলেই উত্তর দেয় এবং প্রশ্নটি খুব জেনারিক এবং প্রাসঙ্গিক আমি এটিকে অপসারণের বিরুদ্ধে দৃ strongly়ভাবে পরামর্শ দিই। আমি এটিকে কোনও "লিঙ্ক কেবল" উত্তর বলব না।
হবি

2
@ 0x7fffffff: এই উত্তরে অন্য উত্তরের বিষয়বস্তু সদৃশ করার ফলে কারও পক্ষে কী উপকার হবে? যদি আপনি বিশ্বাস করেন যে একটি একক সুস্পষ্ট উত্তর পাওয়া সত্যিই গুরুত্বপূর্ণ, তবে সম্ভবত আপনার নিজের মতো উত্তরটি তৈরি করা উচিত (এটি কঠিন হওয়া উচিত নয়: কেবল কিছু বুদ্ধিমান ক্রমে বিদ্যমান উত্তরগুলি একসাথে আঠালো করা উচিত)। ব্যক্তিগতভাবে আমার সময়ের সাথে আমার আরও ভাল জিনিস করা উচিত তবে একজন মডারেটর হিসাবে স্পষ্টতই আমার চেয়ে এসও আপনার কাছে গুরুত্বপূর্ণ।
জন বার্থোলোমিউ

47

আমি যা ব্যবহার করি তা এখানে:

#ifdef _WIN32 // note the underscore: without it, it's not msdn official!
    // Windows (x64 and x86)
#elif __unix__ // all unices, not all compilers
    // Unix
#elif __linux__
    // linux
#elif __APPLE__
    // Mac OS, not sure if this is covered by __posix__ and/or __unix__ though...
#endif

সম্পাদনা: যদিও উপরেরটি বেসিকগুলির জন্য কাজ করতে পারে তবে বুস্ট.প্রাডাইফ রেফারেন্স পৃষ্ঠাগুলি দেখে আপনি কোন ম্যাক্রোটি যাচাই করতে চান তা যাচাই করতে ভুলবেন না । অথবা কেবল বুস্ট.প্রিডফ সরাসরি ব্যবহার করুন।


4
পরিবর্তে __linux __ ব্যবহার করুন, GNU এক্সটেনশানগুলি অক্ষম করে (যেমন -std = c ++ 0x) জিসিসির সাথে সংকলন করার সময় লিনাক্স সংজ্ঞায়িত করা হয় না
এরবুরেথ মনিকা

1
@ এর্বুর্থ ফিক্সড, তবে সর্বাধিক রেট করা উত্তরের মত একটি অবশ্যই সত্যরূপে predef.sourceforge.net/index.php ব্যবহার করা উচিত।
রুবেনভবি

@ রুবেনভ: সত্যই। এবং এটি এখনও খুব কম ভোট পেয়েছে, আমার মনে হয় :) ... আমি অনেকবার তাদের সাইটে ফিরেছি।
0xC0000022L

ধারাবাহিকতার জন্য (সম্ভবত কিছুটা পেডেন্টিক): #ifসংজ্ঞায়িত হলে প্রথমে জিজ্ঞাসা করুন, অন্যরা মানের জন্য পরীক্ষা করে। #elif defined(__unix__) ইত্যাদি করার ক্ষেত্রে যদি আরও ধারাবাহিক হয় তবে আমার ধারণা।
26:36

20

আপনি যদি সি ++ লিখছেন তবে আমি বুস্ট লাইব্রেরিগুলিকে পর্যাপ্ত পরিমাণে ব্যবহার করার পরামর্শ দিতে পারি না ।

সর্বশেষতম সংস্করণে (1.55) একটি নতুন প্রিডাফ লাইব্রেরি রয়েছে যা আপনি যা খুঁজছেন ঠিক তা জুড়েছে , সেই সাথে কয়েক ডজন অন্যান্য প্ল্যাটফর্ম এবং আর্কিটেকচার স্বীকৃতি ম্যাক্রো রয়েছে।

#include <boost/predef.h>

// ...

#if BOOST_OS_WINDOWS

#elif BOOST_OS_LINUX

#elif BOOST_OS_MACOS

#endif

এটিকে উত্সাহ দেওয়া হ'ল এই সমাধানটি বিভিন্ন প্ল্যাটফর্ম / ওএস এবং বিভিন্ন সংকলকগুলিতে কাজ করবে।
ট্রেভর বয়ড স্মিথ

3
"আমি বুস্ট লাইব্রেরিগুলি দৃ strongly়ভাবে ব্যবহার করার প্রস্তাব দিতে পারি না ...." - আমি বুস্টকে তিনবার মূল্যায়ন করেছি। এটি কোনও মূল্যায়ন পাস করতে পারে না ... বেশিরভাগ বাগের প্রতিবেদনটি স্বীকৃত হলে ভাগ্যবান ছিল। ইঞ্জিনিয়ারিং প্রক্রিয়ায় গভীর সমস্যার দিকে স্বীকৃতি পয়েন্টের অভাব। আমি বিশ্বাস করি প্রিপ্রসেসর ম্যাক্রোগুলি এবং সি ++ স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্নির্মিত করা একটি নিরাপদ পছন্দ।
jwww
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.