Как заставить программу на С ++ работать на разных компиляторах - PullRequest
1 голос
/ 31 января 2011

Я хотел знать, как заставить мою программу на C ++ работать на компиляторах.Я хотел сделать программу так, чтобы в случае ее компиляции с borland она использовала функцию clrscr(), в противном случае она использовала бы system("CLS").Я видел код, который сделал нечто подобное, но я не смог найти объяснения того, что он делает или как он работает.Любая помощь будет оценена.

Ответы [ 5 ]

8 голосов
/ 31 января 2011

В общем, чтобы программа на C или C ++ работала на нескольких компиляторах, вы хотите максимально ограничиться стандартом C или C ++.Однако иногда вам приходится использовать специфические функции компилятора / платформы и один из способов справиться с этим - через препроцессор.

Проект предопределенный в SourceForge перечисляет набор символов препроцессора, которые определеныавтоматически различными компиляторами, для разных платформ и так далее.Вы можете использовать эту информацию для реализации того, что вам нужно, например:

void clearScreen() {
  // __BORLANDC__ is defined by the Borland C++ compiler.
  #ifdef __BORLANDC__
    clrscr();
  #else
    system("cls");
  #endif
}
2 голосов
/ 31 января 2011

Один простой ответ из верхней части головы - определить собственные вызовы функций и затем преобразовать их в реальные вызовы в зависимости от параметров компиляции (с определениями предварительной обработки #ifdef - посмотрите, какие значения соответствуют какому компилятору). Пример:

#if defined(__COMPILER_ONE__)
#define ClearScreen() clrscr()
#elif defined(__COMPILER_TWO__)
#define ClearScreen() system("CLS")
#else 
#error "I do not know what to do!"
#endif

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

(Конечно, вы должны заменить COMPILER_ONE и COMPILER_TWO соответствующими определениями :))

0 голосов
/ 31 января 2011

Это можно сделать, проверив макросы компилятора с помощью макроса компилятора #ifdef:

#ifdef BORLAND
    borland();
#else
    otherCompiler();
#endif
0 голосов
/ 31 января 2011

Обычно это делается с помощью препроцессора или make-файлов. В любом случае вы скрываете детали реализации за общим интерфейсом в заголовочном файле, например void clearscreen(). Затем в одном исходном файле вы можете скрыть реализацию Borland за #ifdef BORLAND, и аналогично для других реализаций. В качестве альтернативы, вы можете поместить каждую реализацию в отдельный исходный файл и скомпилировать только правильную на основе переменной в make-файле.

0 голосов
/ 31 января 2011

Как заставить что-то работать на разных компиляторах - простой вопрос, на который очень сложно ответить!Ваш конкретный запрос об очистке экрана;

Я бы попробовал это так, сначала у вас есть собственная функция, скажем

      void clear_screen();

И определите это так:

      void clear_screen()
      {
        #ifdef LINUX
           ...

        #eleif MS_WIN

          ...
        #endif
      }

Обратите внимание, я только что угадалчто такое #defineЭто известно как условное осложнение, обычно рассматриваемое как зло, но содержащее его в функции немного уменьшает вред.

...