IntelliSense を Visual Studio 2008 で確実に動作させる方法
-
09-06-2019 - |
質問
C/C++ プロジェクトで作業するときに IntelliSense を確実に動作させる方法を知っている人はいますか?10 個に 1 個のファイルで機能するようです。Visual Studio 2005 は 2008 よりもはるかに優れているようです。
編集:必ずしも解決策ではありませんが、ここでは回避策を示します。
IntelliSense を Visual Studio 2008 で確実に動作させる方法
まともな IntelliSense システムが必要な場合は、おそらくこれが最善の策です。
他のヒント
ネイティブ C++ インテリセンスは、Visual Studio のどのバージョンでも確実に動作しません。よくある問題が 2 つあることがわかりました。
1) ヘッダー ファイルのパスが正しく設定されていません。インテリセンスが機能していないタイプを見つけた場合は、IDE を使用して各ヘッダー ファイルをクリックし、そのタイプを含むファイルを見つけます。(#include を右クリックし、「ドキュメントを開く...」を選択します)。型を宣言するファイルに到達する前にこれが失敗した場合、これが問題です。ヘッダー ファイルの検索パスが正しく設定されていることを確認してください。
そして、
2) インテリセンス データベースが破損しています。これは常に起こります。ソリューションを閉じ、.ncb ファイルを削除してから、ソリューションを再度開く必要があります。別の質問への回答として、これに使用するマクロを投稿しました ここ.
プリプロセッサはインテリセンスを混乱させる可能性もあります。そのため、ビルド中の #define がインテリセンスでも使用できることを確認してください。それ以外に何が壊れるのかわかりません。前方宣言に関して特に問題は見られませんでした。
Visual Assist を入手できない私たちにとっては、希望が見えてきそうです。
インストールされている (またはアンインストールされている) アドインはありますか?それが私のインテリセンスに影響を与えていることがわかりました。
それに加えて、[ツール] -> [オプション] -> [テキスト エディタ] -> [すべての言語] の [メンバーの自動リスト] と [パラメータ情報] がオフになっていることを確認するだけです。
私は C++ には VS2008 を使用せず、VB と C# のみを使用します。しかし、インテリセンスが動作しなくなる場合 (VS2003/2005/2008 に当てはまります)、それはプロジェクト/ファイル内の何かが壊れていることが原因であることがわかりました (通常、不正なリファレンスまたはコード)。
VB と C# は、参照されたアセンブリを反映してインテリセンス ツリーを構築できるため、インテリセンス サポートがはるかに優れています。
C++ は関数プロトタイプのインクルード ファイルをたどる必要があり、パスが正しくないと、すべてのプロトタイプ ヘッダーが見つかりません。
あのひどいリファクタリングユーティリティが私のコードを切り刻んだ後、itellisense への修正が必要になりました。問題は、それ自体の #include を含むクラス ヘッダー ファイルでした。再帰参照は itellisense を破壊します。この症状は、itellisense が他のクラスを認識できるが、現在のクラスは認識できない場合に発生します。また:
#pragma Once を使用してヘッダーの重複ロードを排除します
プロジェクトの読み込みに非常に長い時間がかかる場合、その itellisense は原因となっている競合を理解しようとしているため、完了サポートが不足しています。
多くの場合、影響を受けるのは 1 つのクラス オブジェクトだけです。これにより、どのファイル (通常はヘッダー) を確認する必要があるかがわかります。
インクルードは正しくセットアップされており、問題はありません。NCB の再構築も何度か試みましたが、100% 修正されることはありませんでした。
クラスの前方宣言に関係があるのではないかと感じています。例えばヘッダー ファイル内のインクルードの複雑さを軽減するために、通常は次のようなことを行います。
class MyPredeclared;
class SomeOtherClass
{
private:
MyPredeclared* m_pPointer;
}
それが台無しだろうか?他に何かアイデアはありますか?プロジェクトが大きくなるほど、状況は確実に悪化します。
非常に厄介な問題がありました。明らかな理由もなく、インテリセンスが一部のファイルでのみ機能していました...グーグルで調べるのに数時間かかりましたが、最終的に、その理由が確かに再帰参照であることがわかりました。私は次のものを使用していました:
#ifndef CLASS_H
#define CLASS_H
...
#endif
シンボルの再定義を避けるためであり、これにより大規模なプロジェクトではインテリセンスが機能しなくなることがあります。
ただし、ifndef-define-endif をコメント化し、次のように記述するだけで十分です。
#pragma once
再定義を回避し、Intellisense を再度動作させるためにヘッダー ファイルの先頭に追加します =)=)
少なくとも、これは私にとってはうまくいきました、役に立てば幸いです...
歓声フランチェスコ
私は最近、テンプレートなどが広範囲に使用されるかなり大規模な C++ 数値線形代数ライブラリを開発しているため、VS2008 の Intellisense を勉強しました。インテリセンスはプロジェクト開始直後に機能しなくなり、半ば諦めかけましたが、インテリセンスがないと非常に面倒になったので、調査することにしました。これが私が知ったことです:
Intellisense を「破壊する」コードを含むファイルがあると仮定すると、
- Intellisense を破壊するヘッダー ファイルがプロジェクト内に存在するが、そうでない場合
#include
d、残りのファイルではまだ動作します - それらが含まれていても、内部で宣言された型が使用されていない場合でも、機能します。
- それらが含まれており、内部で宣言された型が使用されている場合は、まだ少しは機能する可能性があります (メンバーにはインテリセンスがなく、指定された型の出現後にインテリセンスはありませんが、少なくともグローバル名と引数情報は前にあります)。
- 1 つの .cpp ファイルで Intellisense が壊れた場合でも、問題のあるコードが含まれていない、または使用されていない他のファイルでは引き続き機能します (ただし、クラッシュするとプロジェクト全体で無効になると思いますが、実際にはそのようなことは起こりませんでした)自分)
- Intellisense はコンパイルが成功した後に更新されるようです (コンパイル前に更新されない場合もあります)
- 壊れたコードをいずれかの中に入れる
#if 0
,/* .. */
または//
インテリセンスを安心させているようです
私が使用した C++ 機能のうち、実際に Intellisense を破るものはほんのわずかです。
- テンプレートパラメータ内の「>」または「>=」との比較(例:
static_assert<(size > 0)>
)- 二重括弧を使用しても解決されません (
static_assert<((size > 0))>
助けにならない) - 代わりに「<」または「<=」を使用して解決します(
static_assert<0 < size>
作品) - enum に値を保存し、それを使用してテンプレートを特殊化することで解決しました
- 二重括弧を使用しても解決されません (
- 明示的な関数テンプレートの特殊化により、引数情報が無効になります (例:
function<type>(args)
)- おそらく解決できません(マクロでラップする可能性があります)が、壊れていても大丈夫です
- テンプレートメンバータイプのインスタンス化(例)
Matrix::MakeMatrixType<3, 3>::Result r;
- なぜこれが起こるのかを正確に理解するのは難しいです(おそらくEigenの使用が原因です)
- IS が機能しない別の .cpp にそのようなコードを移動することによる回避策 (常に可能であるとは限りません)
これらの問題の一部は、適切な C++ パーサーほど強力ではない「単純化された」解析が原因であると思われます。上記の情報があれば、既存のコードで Intellisense を動作させる「信頼できる」方法がわかります。
- 空のプロジェクト (コンソール アプリ) をセットアップし、ダミーで Main.cpp を作成します。
void main() {}
初期化。 - 壊れたヘッダー ファイルの 1 つをインクルードし、
math.h
- ビルド (Intellisense が確実に更新されるようにコンパイルする必要があります)
- たとえば「」と入力して、Intellisense が機能しているかどうかをテストします。
sin(
引数ヘルプが表示されるかどうかを確認します。場合によっては、これはうまくいきますが、メンバーのヘルプではうまくいかないことがあります。そのため、それも試してください。 - ヘッダー ファイル内に何かのインスタンスを作成し、ビルドして、IS を強制終了できるかどうかを確認します。
- 原因ファイルからコードを削除し、ステップ 3 に進みます。
- 問題のあるコードを見つけて修正した後、手順 5 で削除したコードを元に戻し、もう一度試してください。
- クラス全体がうまく機能するようになったら、次のクラスのインスタンスを作成する、というように続きます。
この方法で、問題が発生したコードの場所を特定するのが簡単であることがわかりました (実際に大規模なプロジェクトではこれが不可能である可能性があることは承知しています。私の場合、問題が発生したのは 97 個のファイルのうち 1 つのファイルだけでした)。ここでの「ビルド」はコンパイルを指し、リンク段階が完了する必要はないため、未解決の外部は問題なく、それに関係なく IS が更新されることに注意してください。
IS を更新する別の方法 (ビルド以外) は、すべてを保存し、ワークスペースを閉じ、.ncb ファイルを削除して再度開くことです。その後、「Intellisense の更新中...」を待ちます。(N)' がステータス バーから消えます (N はゼロに向かってカウントされます。最後まで進まない場合は、問題が発生した部分の進行状況が表示されます)。これはかなり面倒だと思いました。
この問題について、(Visual Studio 2010 上で) 興味深いことに気づきました。この問題を解決するために私は変えました #include
私のヘッダーファイルのsintaxは、以前は次のとおりでした(古いプロジェクトはVS 2005で実行され、VS 2010を使用して再度開かれました)。
#include <myfile.h>
そして私はこれを次のように修正します:
#include "myfile.h"
インテリセンスが正しく動作し始めると、これがお役に立てば幸いです!
設定をリセットしなければならなかったのですが…
C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE>devenv.exe /ResetSettings
問題は .vcproj ファイルにあります。
デバッグ モードからリリース モードに切り替えてビルドし、Intellisense を試してみると、多くの場合機能することがわかります。
Visual Studio を閉じます。プロジェクト内で .vcproj ファイルを検索する場合は、それらを編集し、AdditionalIncludeDirectories の最初の 2 つのインスタンスを検索します。この値は、「../..」ではなく「..\,....\」のようになります。
プロジェクトを再度開き、Intellisense がビルドを完了すると、問題は修正されるはずです。