8

私はBorland C++とVisual C++でコンパイルされたプログラムを書こうとしています。これを行うには、ソースがVSでコンパイルされたときにstdafx.hファイルを含めるために#ifdef _MSC_VERを追加します。コードがコンパイルされ、ボーランドC++でOK実行されますが、VSで、それは失敗します。条件付きでstdafx.hをインクルードした後にコンパイルエラーが発生するのはなぜですか?

エラーC1020:予期しない#endifの私はこのエラーを修正するにはどうすればよい

#ifdef _MSC_VER //I'm in VS 
#include "stdafx.h" 
#endif //this line doesn't compile in VS 


#ifdef __BORLANDC__ //I'm in Borland 
#pragma hdrstop 
#pragma argsused 
#endif 

#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    std::cout << "Hello" << std::endl; 
    std::cin.get(); 
    return 0; 
} 

を?

答えて

11

にMSVCは、プリコンパイル済みヘッダーを実装する方法を引き起こし、コンパイラは、プリコンパイル済みヘッダーにもたらし行までのすべてを無視することは基本的で、かつそこ最初からやり直します。したがって、プログラムをコンパイルするときには、#ifdef行を "覚えていない"ので、#endif行は意味をなさない。

本物の「MS」については、何となく変えることのできる固有の命名体系を超えて、stdafx.hについては何もありません。最初にBorlandに組み込むことを妨げるのはなぜですか?最悪のシナリオでは、_MSC_VERブロックをヘッダーに移動すると、無駄なインクルードファイルが1つしかないことを除けば、現在の状況と同じになります。または、ビルドシステムで#includeをBorland固有のstdafx.hファイルにリダイレクトさせることもできます。

2

これは、プリコンパイルされたヘッダー機能のエフェクトである必要があります。単純な解決策は、VSプロジェクト設定でそれをオフにすることです。 問題があり、それは、プリコンパイル済みヘッダーファイルに保存された状態に

#include "stdafx.h" 

ラインに遭遇した場合、コンパイラはその状態をリセットします。だから、#ifdef...ラインはignoredなり、#endifラインは、コンパイラエラー

1

その他は、PCHの問題にコメントしました。 Borlandでは、別の注記では、#pragma argsusedを関数にアタッチする必要があります。その目的は、関数の引数が関数本体で使用されないように、 "未使用の引数"の警告を出さないことをコンパイラに単一のものにすることです。そのため、#pragma hdrstop#pragma argsusedを同じ#ifdefブロックにグループ化することはできません。あなたは、例えば、それらを分離する必要があります。

#include "stdafx.h" 

#ifdef __BORLANDC__ 
#pragma hdrstop 
#endif 

#include <iostream> 

#ifdef __BORLANDC__ 
#pragma argsused 
#endif 
int main(int argc, char* argv[]) 
{ 
    std::cout << "Hello" << std::endl; 
    std::cin.get(); 
    return 0; 
} 

simplierソリューションは、単に代わりに引数名をコメントアウトすることです:

#include "stdafx.h" 

#ifdef __BORLANDC__ 
#pragma hdrstop 
#endif 

#include <iostream> 

int main(int /*argc*/, char* /*argv[]*/) 
{ 
    std::cout << "Hello" << std::endl; 
    std::cin.get(); 
    return 0; 
} 
5

我々はstdafx.hにして、条件付きコンパイルを切り替えた場合、我々はこのエラーを回避することができます。例えば、次のコード行のため が期待どおりにこのマクロ条件内pragma onceまたは伝統的なヘッダガードを切り替えることができるSTDAFX.H

********************* stdafx.h ************************** 
    #pragma once 

    #if defined (_MSC_VER) 

    #include "targetver.h" 

    #define WIN32_LEAN_AND_MEAN    
    // Windows Header Files: 
    #include <windows.h> 
    #endif 
    ********************************************************* 

で定義することができます。 したがって、私たちはマクロ条件文を移植するので、stdafx.hを任意のC/C++コンパイラでビルドすることができます。intostdafx.h

関連する問題