如何使C ++程序跨编译器工作

时间:2011-01-31 16:48:39

标签: c++ visual-c++ borland-c++

我想知道如何让我的C ++程序在编译器之间运行。我想制作程序,如果它是用borland编译的,它将使用clrscr()函数,否则它将使用system("CLS")。我已经看到代码已经做了类似的事情,但我无法找到它的功能或工作方式的解释。任何帮助,将不胜感激。

5 个答案:

答案 0 :(得分:8)

通常,要使C或C ++程序跨多个编译器工作,您希望尽可能地将自己限制在标准C或C ++中。有时你必须使用编译器/平台特定的功能,并且通过预处理器处理它的一种方法。

SourceForge上的predef项目列出了一系列预处理程序符号,这些符号由各种编译器自动定义,适用于各种平台,等等。您可以使用该信息来实现您所需的信息,例如:

void clearScreen() {
  // __BORLANDC__ is defined by the Borland C++ compiler.
  #ifdef __BORLANDC__
    clrscr();
  #else
    system("cls");
  #endif
}

答案 1 :(得分:2)

从头顶开始的一个简单的答案是定义自己的函数调用,然后根据编译参数将其转换为实际调用(使用#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 替换为相关定义:))

答案 2 :(得分:0)

如何在不同的编译器中创建一些工作是一个简单的问题,非常复杂的答案!您关于清除屏幕的具体问题;

我会这样尝试,首先你有自己的功能说

      void clear_screen();

并按照以下方式定义:

      void clear_screen()
      {
        #ifdef LINUX
           ...

        #eleif MS_WIN

          ...
        #endif
      }

请注意我刚刚猜到#define是什么。这被称为条件并发症,通常被视为邪恶,但在功能中包含它会减少一点伤害。

答案 3 :(得分:0)

它通常采用的方式是通过预处理器或makefile的魔力。无论哪种方式,您都会在头文件中隐藏实现详细信息,例如void clearscreen()。然后在单个源文件中,您可以隐藏#ifdef BORLAND背后的Borland实现,对于其他实现也是如此。或者,您可以将每个实现放在一个单独的源文件中,并且只根据makefile中的变量编译正确的实现。

答案 4 :(得分:0)

您可以通过使用#ifdef编译器宏检查编译器宏来执行此操作:

#ifdef BORLAND
    borland();
#else
    otherCompiler();
#endif