Кроссплатформенное программирование на C ++ - PullRequest
1 голос
/ 02 апреля 2012

Я хочу, чтобы программа работала и компилировалась в обоих WIN \ Linux .
Я хочу получить некоторую информацию о ОС , на которой запущена моя программа.
Более того, я хочу иметь переменную, чтобы решить, какой код я хочу выполнить.

Я подумал о том, что предварительно обработанный код должен иметь вход для моей управляющей переменной, которую я описал.
Итак, я должен иметь что-то вроде:

#  //a preprocess code to detect the os
# define controllingVar // ?

Я использую C ++;

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

Вы можете проверить, был ли определен макрос WIN32:

#ifdef WIN32
   // do windows stuff
#else
   // do GNU/Linux stuff
#endif

Обратите внимание, что на некоторых компиляторах вам также может потребоваться проверить _WIN32, как указано в wikipedia .

Как пример:

#ifdef WIN32
   void foo() {
       std::cout << "I'm on Windows!\n";
   }
#else
   void foo() {
       std::cout << "I'm on GNU/Linux!\n";
   }
#endif

Редактировать : поскольку вы спрашиваете о разных main s для каждой ОС, вот пример:

int main() {
#ifdef WIN32
   // do whatever you want when executing in a Windows OS
#else
   // do the same for GNU/Linux OS.
#endif
}

Вы также можете иметь разные main s:

#ifdef WIN32
   int main() {
       //windows main
   } 
#else
   int main() {
       //GNU/Linux main
   } 
#endif
1 голос
/ 02 апреля 2012

Вы можете определить, для какой платформы ваш код компилируется , для чего используются (специфичные для компилятора) макросы препроцессора, такие как WIN32 и т.п.Нет простого способа определить, на какой платформе ваша программа работает с (кроме того, она, скорее всего, работает на платформе, для которой она была скомпилирована) - для этого вам нужно будет выполнить вызовы, специфичные для платформы / ОС..

Вы можете сделать что-то вроде этого:

#ifdef WIN32 // compiler specific, WIN32 is defined in Visual Studio
  // Windows specific code
  // include Windows specific headers
  int controllingVar = 0; // 0 - Windows
#else
  // For everything else
  // Here: assume Unix/Linux
  // include Linux specific headers
  int controllingVar = 1; // 1 - non-Windows
#endif

После этого вы можете сослаться на controllingVar в вашем коде.controllingVar будет иметь значение 0, если программа была скомпилирована для Windows, в противном случае - 1 (и вы можете исходить из предположения о Linux).

Часть #ifdef включает условную компиляцию - код внутриБлок, специфичный для Windows, компилируется только тогда, когда он компилируется для Windows, а другой - в любом другом случае.

Обратите внимание, что это, по сути, требует дублирования усилий по кодированию, обслуживанию и тестированию, поэтому старайтесь размещать только самый важный код вусловные блоки и все, что не зависит от платформы за его пределами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...