2009-07-30 18 views
1

不特定のソフトウェアをコンパイルしようとしていて、stdio.hのような標準ヘッダーでエラーが発生しています。エラーは、ほとんどが、_In_のような宣言されていない識別子です。 IntelliSenseはその定義をうまく見つけます。何の一般的な方向で私はこれの原因を探すべきですか?標準ライブラリでコンパイルエラーが発生しています。どうしたの?

追加:たとえば、1つのcppファイルstdio.hが最初に含まれているファイルです - 前に見ることのできる定義はありません。プリコンパイルされたヘッダーは使用されません。私のインストールの他のものはうまくコンパイルされます。

+1

エラーメッセージとそれを再現する最小限のコード例を投稿できますか?私の推測では、プリプロセッサ定義のいくつかは間違っている/重複している/設定されていないが、それはちょうど推測です。 –

+0

はい、Visual Studioには、プリプロセッサの定義とファイルごとの設定が含まれるプロジェクト設定があります。 –

+0

stdio.hを含むファイルの内容を投稿してください(または同じ問題がある切り捨てられた例) – jalf

答えて

6

「間違ったことをしているんだよ」と私ができる最高のことです。

標準ライブラリがコンパイルされていますが、それほど多くのことがわかります。

だから、どちらかのプロジェクトの設定が間違っている、またはあなたのコード内で何かが(例えば、おそらくいくつかの悪いの#define、)含まれているファイルに影響を与え

あなたはより具体的な答えをしたい場合は、私たちを与える必要があります特定の情報 どのエラーが表示されますか?ファイルはどのように含まれていますか?問題を再現する最小限のコードを表示できますか?

+0

結局のところ、それはVisual Studioです。 gccに切り替える時間... –

+15

gccではエラーを作ることができないので、そうですか?コンパイラはあなたがしたいことを魔法のように検出し、あなたのためのコードを書く*と*はコンパイラフラグを設定します。 Microsoftはコンパイラを書いたときにそれを考えなかった... バブルを破棄して申し訳ありませんが、C++コンパイラでは、1)標準ライブラリを破壊するコードを書くこと、2)コンパイラフラグを指定することそれはあなたのコードをコンパイルできません。 – jalf

+3

しかし、gccは、ビルド環境を記述するときに再現するのが難しい、あいまいでない場所にプリプロセッサ定義を含むコンパイラフラグを格納しません。それがmakeの目的です。 –

0

標準の行をコンパイルする必要があります。ただし、Visual Studioのインストールで提供されているヘッダーで一部のファイルを変更または削除した場合、問題が発生し、すべてを再インストールする必要があります。

新しい「hello world」コンソールアプリケーションを作成する方法の1つは確実です。 stdafx.hにstdioが含まれます。

私はこれがあなたの問題だとは思っていません。より良い答えが必要な場合は、問題の詳細を述べるべきです。

stdioはstdafx.hに含まれていますか?

+0

またはそれ以上の理由で、_mostly_で十分です。最初にプリコンパイルされたヘッダーを使用します。あなたのコンパイラが壊れているかどうかを調べようとしているときは、それを単純に保つ理由が増えます。 – jalf

2

VSはプリコンパイル済みヘッダーを使用するのが好きなので、前提条件に違反していないことを確認してください。問題の原因の1つは、stdafx.hを含む行の先頭にあるすべてのヘッダーに名前を付けることです。

ヘッダーがプリコンパイルされていない場合でも、株式ヘッダーの定義とうまくやりとりするものを誤って定義している可能性があります。 stdio.hを見ると、いくつかの異なるプラットフォームに同じファイルが配布されているので、いくつかの興味深い条件付きコンパイルセクションがあることがわかります。プロジェクトの設定を確認し、特定のソースファイルをコンパイルするときにのみ問題が発生している場合は、そのファイルのコンパイル設定も確認してください。

それは...

#include <stdio.h> 
int main(int argc, char **argv) { 
    printf("hello, world.\n"); 
    return 0; 
} 

新しいプロジェクトを開始し、古き良きのhello.cをコンパイルすることができるかどうかをチェック確かに価値があるではない場合、その後、あなたのVSのインストールと真剣に何か問題があります。

別のコンパイラがインストールされていて、別のstdio.hを使って何らかの形でVSが発生している場合は、他の可能性はありますが、問題は発生しません。不適切なINCLUDE環境変数が、最近のバージョンではそうは確かではありません。私はずっと前にそれを燃やしてしまいました。それ以来、個々のコンパイラがどのような変数を設定したのかをはるかに注意しています。

2

可能性:

  • 間違ったフラグでコンパイルします。具体的には、インクルードパスが正しく設定されていません.CではなくC++用にコンパイルしています。
  • ヘッダーの前に、標準ヘッダー内のものを再定義するものが含まれています。あなたの質問から、この音は聞こえにくいものになります。
  • コンパイラーのコマンドラインで、いまいましいものを定義しています。
  • あなたのヘッダが

あなたのコンパイラが間違っている、間違っている、標準に準拠していない、など
  • ベスト診断、間違った間違った、コンパイラのバージョンで使用することを意図していない、などですされます前処理されたソースをダンプします。どのコンパイラにもオプションがあります。私はそれがgcc上の-Eであると信じています。Visual StudioのためのドキュメントやGUIオプションをチェックしてください。

  • 0

    エラーは、ほとんどが_In_のような宣言されていない識別子です。 IntelliSenseはその定義をうまく見つけます。何の一般的な方向で私はこれの原因を探すべきですか?

    宣言されていない識別子

    は、おそらくあなたの標準ヘッダは、それ自体がそれを見つけ、 includeに別のヘッダを(内部的に)いないしようとしているので、得ていない識別子が正しく宣言/定義されていることを意味します。

    追加:たとえば、1つのcppファイルにstdio.hが含まれている最初のファイルです - 前に見ることができる定義はありません。

    defineは、定義とは異なる宣言とは異なります。あなたはすでにこれを知っているでしょうが、私は確信しています。

    質問にはC++とタグ付けされているので、stdio.hの代わりにincludecstdioをお勧めします。おそらく、コンパイラのエラーは修正されませんが、公式のC++ヘッダです。 POSIXシステムでは、標準のCヘッダがPOSIXのもので拡張されることがあります。私の経験上、これらのヘッダーのC++バージョンでは、同じ拡張機能はありません。

    0

    さまざまなバージョンのヘッダーライブラリ間で不一致があると、これも同様に発生する可能性があると思います。最近、SDKなどの標準ライブラリの新しいバージョンをインストールしましたか、それともPATHやそのようなもので再生しましたか?

    0

    これは今日私に起こりました。このフォーラムで回答を探した後でも、それを解決するには4時間もかかりませんでしたので、問題とその解決策を投稿してみましょう。

    Iは(わずかに少ない明らか形で)これを有していた:

    namespace MyApp 
        { 
    
        #include "MyUtilities.hpp" 
    
        }; 
    
        #include "MoreUtilities.hpp" 
    

    両方MyUtilities.hppMoreUtilities.hppは<wait.h>が、MoreUtilities内部標準のシステム・タイプsigval_tを使用する(ライブラリによって)第二の試みを含ま.hppは(標準ライブラリに)コンパイラエラーを投げました。元のポスターに関しては、これはコンパイラが最初に見つけたエラーです。私にとっては、それは標準的なタイプであり、それは "私のコードではありませんでした"ので、明らかに間違っているように見える刺激的な "タイプが見つかりません"というエラーを生成しました。

    <wait.h>の2番目のインクルードは、定義が既に作成されているため、新しいコードを生成しませんでした。ただし、異なる名前空間にあるため、コンパイラでは見つかりませんでした。

    解決策はもちろん、すべてのローカル名前空間宣言の外側で#include <standard-header.h>になるようにしてください。

    関連する問題