2011-01-31 9 views
1

コンパイラ間でC++プログラムをどのように動作させるかを知りたがっています。私はプログラムを作りたいと思っていました。もしそれがclrscr()関数を使用すると、それはsystem("CLS")を使用していました。私は同様のことをしたコードを見たことがありますが、それが何をしているのか、それがどのように機能しているのかの説明は見つかりませんでした。どんな助けもありがとう。コンパイラ間でC++プログラムを動作させる方法

答えて

0

異なるコンパイラ間で何かをするには、簡単な質問は答えが複雑です!画面をクリアするための具体的な質問。

私は

 void clear_screen(); 

を言うと、このようにそれを定義する独自の機能を持っている最初の、このようにそれを試みる:私は何の#defineの推測しているのでご注意ください

 void clear_screen() 
     { 
     #ifdef LINUX 
      ... 

     #eleif MS_WIN 

      ... 
     #endif 
     } 

をあります。これは一般的に悪とみなされる条件付き合併症として知られていますが、それを機能に含めると害を少し軽減します。

+0

条件付きコンパイル(もちろん、あなたがCOMPILER_ONEと関連定義:)とCOMPILER_TWOを代用する必要がありますか)?ほとんど。最も重要なマルチプラットフォームプロジェクト以外のすべてにおいて、もっと必要なことはもっと似ています。 –

+0

@PigBen True。それにもかかわらず、穏やかな邪悪な悪です。 「控えめに使う」は、より正確ではあるが、より楽しい。 –

+0

悪い!==必須ではありませんが、条件付きコンパイルは、必要なevil imhoのかなり良い例です。 –

0

通常は、プリプロセッサやmakefileの魔法を使います。いずれにしても、ヘッダファイル内の共通インタフェースの背後にある実装の詳細は、void clearscreen()のように隠蔽します。その後、単一のソースファイルで、#ifdef BORLANDの背後にあるBorlandの実装を隠すことができます。他の実装でも同様です。あるいは、各インプリメンテーションを別々のソースファイルに入れて、makefileの変数に基づいて適切なものだけをコンパイルすることもできます。

8

一般に、複数のコンパイラでCまたはC++プログラムを動作させるには、できるだけ標準CまたはC++に自分自身を限定したいと考えています。コンパイラ/プラットフォーム固有の機能を使用する必要がある場合もあります。その処理方法の1つは、プリプロセッサを使用する方法です。

SourceForgeのpredefプロジェクトでは、様々なプラットフォームでさまざまなコンパイラによって自動的に定義されたプリプロセッサシンボルがまとめられています。の上から

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

関数内で条件付きコンパイルをしないでください。コマンドのForeachバージョンは、各コンパイラに適切なマクロ定義を生成します。あなたがもっと複​​雑なことをしようとすればすぐに、この単純なタイプのコマンドではうまくいくようですが、コードは読めなくなります。 clearScreen()が行う必要があるのは、マクロを呼び出すことだけです。PLATFORM_CLEAR_SCREEN() –

+0

@Martin - 大部分の作業をマクロの手に入れようとしていますか?しかし、マクロは[悪](http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.4)です! :) – Mac

0

あなたは#ifdefコンパイラマクロとコンパイラマクロをチェックすることでこれを行うことができます:あなたは、たとえば、あなたが必要なものを実装するためにその情報を使用することができますheadは独自の関数呼び出しを定義し、コンパイルパラメータに応じて実際の呼び出しに変換します(#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 

あなたは、このための専用のヘッダファイルを作成する必要がありますし、もちろん、どこでもそれを含めること。

悪とみなさ

2

一つの簡単な答え:

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