以下问题困扰了我的一个项目很长一段时间:
从智能感知中排除/隐藏某些功能定义(来自.cpp文件)
这些功能无法“转到定义”,也不会在导航栏中列出。
但是,这些功能确实出现在自动填充列表中。问题仅在于.cpp文件,.h文件被解析得很好。 “Goto宣言”也有效。
自2005年以来,这是相同的,每个新版本,我都希望能够修复,但它似乎没有被任何其他人认定为错误。
更新 我已将此跟踪到以下内容:intellisense无法识别包含某个宏的所有函数。原始宏是
#define forlist(x,list) for( auto x= list.begin(); x.valid(); ++x)
但您也可以使用简化的测试用例
#define fortest(x) for( auto x= 1; x< 2; ++x)
void myclass::TestFN()
{
fortest( g )
{
g;
}
}
下一步是找到解决方法(或尝试通过micrsoft错误报告)。
请不要对此宏咆哮太多。这是列表实现的现有代码,我无法更改。我可能不会使用宏,但我仍然认为这是一个VS错误。
一个有趣的事情是,以下(真的 * ** ic宏)工作正常:
#define fortest(x) for( auto x= 1; x< 2; ++x) {
void myclass::TestFN()
{
fortest( g )
g;
}
}
intellisense是否可以将案例1视为非法的本地函数定义? (见http://connect.microsoft.com/VisualStudio/feedback/details/781121/c-intellisense-mistakes-loop-expression-for-function-definition)
以下工作也很好
#define fortest(x) for( auto x= 1; x< 2; ++x)
void myclass::TestFN()
{
fortest( g )
g;
}
答案 0 :(得分:20)
像往常一样,对我的问题的兴趣在几个小时后消失了,所以我不得不自己解决这个问题......
我们必须使用cpp.hint
文件的概念。
基本上你必须把麻烦的宏放到一个名为cpp.hint
的文件中,并将该文件放在你的解决方案目录中(这对我不起作用)
或者在代码文件所在的父目录中。(为我工作)
在那个文件中我们只是把麻烦的宏放在右边,所以例如:
#define forlist(x,list)
注意:您必须重置IntelliSense缓存才能使用已更改的
cpp.hint
文件中的新数据。你应该:
- 删除
ipch
文件夹(通常放在解决方案文件夹中)。- 删除解决方案文件夹中的所有* .sdf文件。
- 删除解决方案文件夹或
ipch
文件夹中的所有* .VC.db文件。
对于更高级的宏(例如,为代码块设置&#39; start&#39;和&#39; end&#39;宏),还有其他一些技巧。
原始链接是: http://msdn.microsoft.com/en-us/library/dd997977.aspx
麻烦的原因是,如果必须解析项目中的所有宏,Intellisense性能会(可能)显着降低,因此它只解析那些在cpp.hint&#39;中明确给出的那些。