40

C/C++ プロジェクトで作業するときに IntelliSense を確実に動作させる方法を知っている人はいますか? 10個中1個程度のファイルで動作するようです。Visual Studio 2005 は 2008 よりもはるかに優れているようです。

編集:必ずしも解決策ではありませんが、ここで提供される回避策:

Visual Studio 2008 で IntelliSense を確実に動作させる方法

まともな IntelliSense システムが必要な場合は、おそらく最善の策です。

4

12 に答える 12

32

ネイティブ C++ インテリセンスは、どのバージョンの Visual Studio でも確実に機能しません。2 つの一般的な問題があることがわかりました。

1) ヘッダー ファイルのパスが正しく設定されていません。IntelliSense が機能していない型を見つけたら、IDE を使用して各ヘッダー ファイルをクリックし、その型を含むファイルを見つけます。(#include を右クリックし、[ドキュメントを開く...] を選択します)。タイプを宣言するファイルに到達する前にこれが失敗した場合、これが問題です。ヘッダー ファイルの検索パスが正しく設定されていることを確認してください。

と、

2) インテリセンス データベースが壊れています。これは常に起こります。ソリューションを閉じ、.ncb ファイルを削除してから、ソリューションを再度開く必要があります。ここで別の質問に答えて、これに使用するマクロを投稿しました。


プリプロセッサも intellisense を混乱させる可能性があるため、ビルド中の #define が intellisense でも利用できることを確認してください。それ以外に、他に何がそれを壊すことができるのかわかりません。前方宣言に関する特定の問題は見たことがありません。

于 2008-09-02T13:33:01.607 に答える
27

また、大きなプロジェクトで、Intellisense が「失われる」ことがあるということにも気付きました。なんで?わかりません。

これが、( Tomato ソフトウェアから) Visual Assistを購入し、Visual Studio サブディレクトリ (C:\Program Files\Microsoft Visual Studio 8\VC\vcpackages) の dll feacp.dll を削除して Intellisense を無効にした理由です。

これは解決策ではなく、単なる回避策です。

于 2008-09-02T14:02:01.240 に答える
6

Visual Assist を入手できない私たちに希望が見えてきたようです。

インテリセンスの再構築

于 2009-05-29T18:18:46.310 に答える
4

アドインをインストール (またはアンインストール) していますか? それが私のインテリセンスに影響を与えることがわかりました。

それに加えて、ツール->オプション->テキストエディター->すべての言語の「自動リストメンバー」と「パラメーター情報」がチェックされていることを確認してください。

于 2008-09-02T14:01:50.430 に答える
2

そのひどいリファクタリングユーティリティが私のコードを切り刻んだ後、 itellisense への私の修正が必要でした。問題は、それ自体の #include を含むクラス ヘッダー ファイルでした。再帰参照は itellisense を破壊します。この症状は、itellisense が他のクラスを認識できるが、現在のクラスを認識できない場合です。また:

#pragma once を使用して、ヘッダーの重複ロードを排除します

プロジェクトの読み込みに非常に長い時間がかかるようになった場合、その itellisense は原因となっている競合を理解しようとしており、完了サポートが不足しています。

多くの場合、影響を受けるのは 1 つのクラス オブジェクトだけです。これにより、どのファイル (通常はヘッダー) を調べる必要があるかがわかります。

于 2010-10-15T01:03:53.550 に答える
2

私は C++ には VS2008 を使用せず、VB と C# のみを使用しますが、インテリセンスが機能しなくなった場合 (VS2003/2005/2008 の場合)、プロジェクト/ファイル内の何かが壊れていることが原因であることがわかりました - 通常は参照またはコードが間違っています。

VB と C# は、参照されたアセンブリを反映して IntelliSense ツリーを構築できるため、IntelliSense サポートがはるかに優れています。

C++ は関数プロトタイプのインクルード ファイルをたどる必要があり、パスが正しくない場合、すべてのプロトタイプ ヘッダーが検出されません。

于 2008-09-02T13:36:33.547 に答える
1

私は非常に厄介な問題を抱えていました.intellisenseはいくつかのファイルでしか機能していませんでしたが、明確な理由はありませんでした.Googleを掘り下げるのに数時間かかりました. 私は以下を使用していました:

#ifndef CLASS_H
#define CLASS_H
...
#endif

シンボルの再定義を避けるために、これは大規模なプロジェクトでインテリセンスを壊すことがあります。

しかし、ifndef-define-endif をコメントして、次のように入力するだけで十分です。

#pragma once 

再定義を回避し、Intellisense が再び機能するようにヘッダー ファイルの先頭に =)=)

少なくとも、これは私にとってはうまくいきました。役に立つことを願っています...

乾杯フランチェスコ

于 2011-06-02T09:51:00.627 に答える
1

@ジョン・リチャードソン/ @ジョナサン・ホランド

私のインクルードは正しくセットアップされており、問題はありません。NCB の再構築も何度か試みましたが、100% 修正されることはありません。

クラスの前方宣言に関係している可能性があると感じています。たとえば、ヘッダー ファイルのインクルードの複雑さを軽減するために、通常は次のようにします。

class MyPredeclared;

class SomeOtherClass
{
private:
    MyPredeclared* m_pPointer;
}

それはそれを台無しにするのだろうか?他のアイデアはありますか?プロジェクトが大きくなればなるほど、それは間違いなく悪化します。

于 2008-09-02T13:41:26.873 に答える
1

私は最近、VS2008 で Intellisense を研究しました。これは、テンプレートなどが広く使用されている、かなり大規模な C++ 数値線形代数ライブラリを開発しているためです。Intellisense はプロジェクトの開始直後に機能しなくなり、私はちょっとあきらめましたが、今ではそれがないと本当に面倒になったので、調査することにしました。これは私が見つけたものです:

Intellisense を「壊す」コードを含むファイルがあると仮定すると、

  • Intellisense を壊すヘッダー ファイルがプロジェクトにあるが、#included ではない場合、残りのファイルでは引き続き機能します。
  • それらが含まれていても、内部で宣言されたタイプが使用されていない場合でも、機能します
  • それらが含まれていて、内部で宣言された型が使用されている場合でも、少しは機能する可能性があります (メンバーの Intellisense はなく、特定の型の発生後に Intellisense はありませんが、少なくともグローバル名と引数情報は前に)
  • Intellisense が 1 つの .cpp ファイルで壊れていても、問題のあるコードが含まれていない、または使用されていない他のファイルでも機能します (ただし、クラッシュがひどい場合は、プロジェクト全体で無効になると思いますが、それは起こりませんでした)。自分)
  • コンパイルが成功した後、Intellisense が更新されたようです (前に更新されていない場合もあります)。
  • のいずれかに壊れたコードを入れるか#if 0/* .. */または//Intellisense を安心させるようです

私が使用した C++ 機能から、実際に Intellisense を壊すのはごくわずかです。

  • テンプレート パラメータの「>」または「>=」との比較 (例: static_assert<(size > 0)>)
    • 二重括弧を使用しても解決されstatic_assert<((size > 0))>ない ( 役に立たない)
    • 代わりに '<' または '<=' を使用して解決します (static_assert<0 < size>動作)
    • 値を列挙型に保存し、それを使用してテンプレートを特殊化することで解決
  • 明示的な関数テンプレートの特殊化により、引数情報が無効になります (例: function<type>(args))
    • おそらく解決できません(マクロでラップする可能性があります)が、壊れても大丈夫です
  • などのテンプレート メンバ タイプのインスタンス化Matrix::MakeMatrixType<3, 3>::Result r;
    • なぜこれが起こるのかを正確に理解するのは難しいです(おそらくEigenの使用によるものです)
    • IS が機能しない別の .cpp にそのようなコードを移動することによる回避策 (常に可能とは限りません)

これらの問題のいくつかは、適切な C++ パーサーよりも強力ではない「単純化された」構文解析によるものと思われます。上記の情報が手元にあれば、既存のコードで Intellisense を機能させる "信頼できる" 方法は次のとおりです。

  1. 空のプロジェクト (コンソール アプリ) をセットアップし、ダミーを含む Main.cpp を作成しますvoid main() {}
  2. 壊れたヘッダー ファイルの 1 つをインクルードし、math.h
  3. ビルド (Intellisense を確実に更新するには、コンパイルする必要があります)
  4. eg と入力して、Intellisense が機能しているかどうかをテストしsin(、引数のヘルプが表示されるかどうかを確認します。場合によってはこれでうまくいくこともありますが、メンバーのヘルプはうまくいかないので、それも試してみてください。
  5. ヘッダー ファイルで何かのインスタンスを作成し、ビルドして、それが IS を強制終了するかどうかを確認します。
  6. 犯人ファイルからコードを削除し、手順 3 に進みます
  7. 問題のあるコードを見つけて修正したら、手順 5 で削除したコードを元に戻し、もう一度やり直してください。
  8. クラス全体をうまく動かせたら、次のクラスのインスタンスを作って……。

この方法で、問題が発生したコードの場所を特定するのは簡単であることがわかりました (私の場合、問題が発生したのは 97 ファイル中 1 ファイルだけでした)。ここでの「ビルド」はコンパイルを指します。リンク段階は終了する必要がないため、未解決の外部は問題ありません。IS は関係なく更新する必要があります。

IS を更新する別の方法 (ビルド以外) は、すべてを保存し、ワークスペースを閉じ、.ncb ファイルを削除してから再度開くことです。次に、「Intellisense を更新しています ... (N)」がステータス バーから消えるまで待ちます (N はゼロに向かってカウントされます。完全に進まない場合は、問題が発生した場所の進行状況を示します)。これはかなり面倒だと思いました。

于 2013-12-05T10:26:17.340 に答える
0

この問題について、興味深いことに気付きました (Visual Studio 2010 で): この問題を解決するため#includeに、以前はヘッダー ファイルのシンタックスを変更しました (古いプロジェクトは VS 2005 で行われ、VS 2010 を使用して再度開かれました):

#include <myfile.h> 

そして私はこれを修正します:

#include "myfile.h"

インテリセンスが正しく機能し始めた後!これが役立つことを願っています!

于 2011-03-28T07:45:30.100 に答える
0

設定をやり直す必要がありました...

C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE>devenv.exe /ResetSettings

ここのスレッド

于 2011-05-11T08:33:07.823 に答える