gpt4 book ai didi

c++ - 为什么 Visual Studio 会去定义一些 undefined variable ?

转载 作者:行者123 更新时间:2023-11-28 00:06:34 25 4
gpt4 key购买 nike

当我愚蠢地错误地假设如果 Visual Studio 准备转到我右键单击的变量的定义时,我经历了令人沮丧的几个小时试图解决某个编译器错误,那么该变量必须是定义。这是我习惯的行为。

涉案案例winsvc.h它定义了 SERVICE_STATUS .如果我成功编译我的项目,然后右键单击 SERVICE_STATUS “转到定义”,然后很自然地把我带到了 winsvc.h 中的相关行.

但是,当我注释掉我的 #include <winsvc.h> 时以至于我无法编译成功,我仍然可以右键单击SERVICE_STATUS在我的文件中无法编译,因为它不再被定义...并且仍然被带到 winsvc.h 中的行.

如果我尝试对某些其他文件执行此操作 - 特别是我编写的文件 - 注释掉定义某些变量的文件也会破坏“转到定义”功能。这对我来说很有意义 - 如果它没有被定义,那么就不要去做。

那么winsvc.h有什么特别之处呢? ?这种(错误?功能?)现象适用于哪些其他文件?虽然这个问题一直asked before ,没有一个答案被接受,就我而言,他们似乎都误解了这个问题。

最佳答案

首先,更强烈地重申@MatteoItalia 的评论,IntelliSense 不是代码分析器或验证器。相反,它是一个使用快速试探法的即时“引用调度程序”,相当于编译器级解析。这是设计使然 - 引用 MSVC++ 团队的 Thierry Miceli Tag Parsing C++ (用粗体突出显示):

The tag parser is used in Visual Studio 2010 to populate the SQL database that supersedes the NCB file. All of the browsing features of VC++ rely in some way on results provided by the tag parser. These include Class View, Call Hierarchy, Go To Definition/Declaration, Get All References, Quick Search, the Navigation Bar and VCCodeModel.

[...] It is a fuzzy parser, which means that instead of trying to strictly recognize and validate the full C++ syntax (we have an excellent compiler front-end to do that) it lazily matches an input stream of tokens with some patterns.

[...] The tag parser doesn’t try to make sense of every symbol or identifier in the source code. [...] If a name in the type specification of a declaration couldn’t get resolved by our C++ compiler this would not prevent the tag parser from recognizing the declaration and it will show up in Class View.

还有一点是,SDF 数据库是按项目而不是按单个文件的。一旦项目中的文件 #include'd(并使用) ,IntelliSense 将识别同一项目中任何其他文件中的 SERVICE_STATUS。这很容易验证 - 只需向项目添加一个新的空 .cpp 文件,然后输入 SERVICE_STATUS。 “ 转到定义”将转到 定义,即使新文件中不包含 header ,即使文件本身根本不可编译。

最后,如果项目只包含一个文件,在删除 #include 后不再编译,则可能是 SDF 没有重建,并记住现在是过时的引用。

关于c++ - 为什么 Visual Studio 会去定义一些 undefined variable ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35399439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com