Visual Studio C++ 2005-2013中智能感知中缺少的函数定义

nuu*_*nuu 11 c++ intellisense visual-studio visual-c++

以下问题困扰了我的一个项目很长一段时间:

一些函数定义(来自.cpp文件)被从智能感知中排除/隐藏!

这些功能无法" 转到定义 ",也不能在导航栏中列出.

但是,这些功能确实出现在自动完成列表中.问题仅在于.cpp文件,.h文件被解析得很好."Goto宣言"也有效.

这是自2005年以来的相同,每个新版本,我都希望能够修复,但它似乎没有被任何其他人认定为错误.

更新: 我已将此跟踪到以下内容:intellisense无法识别包含某个宏的所有函数.原来的宏是

#define forlist(x,list) for( auto x= list.begin(); x.valid(); ++x)
Run Code Online (Sandbox Code Playgroud)

但您也可以使用简化的测试用例

#define fortest(x)  for( auto x= 1; x< 2; ++x)

void myclass::TestFN()
{
    fortest( g )
    {
        g;
    }
}
Run Code Online (Sandbox Code Playgroud)

下一步是找到一种解决方法(或尝试通过micrsoft bug报告).

请不要对这个宏咆哮太多.这是列表实现的现有代码,我无法更改.我可以不使用宏,但我仍然认为这是一个VS错误.

一个有趣的是,以下(真正的***ic宏)工作正常:

#define fortest(x)  for( auto x= 1; x< 2; ++x) {

void myclass::TestFN()
{
    fortest( g )
        g;
    }
}
Run Code Online (Sandbox Code Playgroud)

可能是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;
}
Run Code Online (Sandbox Code Playgroud)

nuu*_*nuu 20

像往常一样,对我的问题的兴趣在几个小时后消失了,所以我不得不自己解决这个问题......

我们只需要使用cpp.hint文件的概念.

基本上你必须将麻烦的宏放入一个名为的cpp.hint文件中并将该文件放在解决方案目录中(这对我不起作用)或者在你的代码文件所在的父目录中.(为我工作)

在那个文件中我们只是把麻烦的宏放在右边,所以例如:

#define forlist(x,list)
Run Code Online (Sandbox Code Playgroud)

注意:您必须重置IntelliSense缓存才能使用已更改cpp.hint文件中的新数据.你应该:

  • 删除ipch文件夹(通常放在Solution文件夹中).
  • 删除Solution文件夹中的所有*.sdf文件.
  • 删除解决方案文件夹或ipch文件夹中的所有*.VC.db文件.

对于更高级的宏(比如代码块的'start'和'end'宏),还有其他一些技巧.

原始链接是:http: //msdn.microsoft.com/en-us/library/dd997977.aspx

出现问题的原因是,如果必须解析项目中的所有宏,Intellisense性能会(可能)显着降低,因此它只解析那些在'cpp.hint'中明确给出的宏.

  • 我刚刚发现,我必须对每个 .cpp 文件进行一些更改(例如添加一个新行)才能发挥作用。修复似乎不会自动应用。 (2认同)
  • 谢谢你让我睁开了眼睛!但是对我来说,它是这样工作的:复制你想要的所有定义的宏,并将 cpp.init 文件放在解决方案所在的主目录中! (2认同)