vscode自动补全太差c语言,VSCode智能提示,你知道多少?

vscode的智能提示规律是怎么样的?怎么增强有用的智能提示屏蔽没用的代码提示?这篇文章将一一解答。

1.智能提示与代码跳转

将鼠标悬停在代码处,凡是能出现智能提示的地方,都能通过 ctrl + 鼠标左键的方式跳转到它的定义处,如果有多个定义,则会让你选择跳转到哪里。

悬停显示:

33d57f7ab36dc2e7613ac8be6ca14a0f.png

ctrl + 鼠标左键,代码跳转:

5feda2cce26a40106ad0fb84355be1c6.png

2.哪些代码会提示,哪些会屏蔽

对于同一个文件的代码来说,所有代码逻辑能访问到的代码都可以获得智能提示。

77860037acaaeb009a436cc3c64d2d6c.png

599f19483bff3ffcddbf6e8a35a99b02.png

18152ee87d57562a7a46cb0266de9f81.png

依次获取函数内变量,类里面的函数,文件里面的变量,这3者从代码逻辑来说都能获取,所以也能显示对应的智能提示。反之,代码逻辑不能获取的不仅没有智能提示,而且会报错:

1f8ff9e4755fee514a1e159ecfb65824.png

onLoad函数里面访问不到函数  newJourney里面的局部变量 b,所以报错。

不同文件间的智能提示是怎么样的呢?

1.如果一个文件里面没有 import,require,export,export default等导入导出语句,那么这个文件就会被当做全局文件对待,它的所有顶层数据都会暴露给其他文件,其他文件能获取它的所有顶层数据的智能提示,但是逻辑上不一定能直接访问(这是一个需要特别注意的点,后面会说明)。如:

6c843e9503c47f4cc73d187bb14e9c17.png

在其他任意文件可以直接获取上面数据的智能提示:

70e2e3fdb9503e6b826a4e62e691200a.png

对于有 import,require,export,export default 等导入导出语句的文件,他们会被当做模块,此时只有 export,export default 的那些数据会被外部访问到,而且vscode会帮你自动写import导入语句,如:

663b67a3d82ccc9832f4ca7a6aa14f09.png

上面文件只有Home类能被外部访问到:

201e4e396f94764af85a9f7cbb4e4129.png

访问Home.ts文件里面的顶层数据test会报错。

总结起来就是一句话:有导入导出语句的文件,只有导出部分能暴露给外面访问,没有导入导出的普通文件,所有定义的顶层数据都能被外面访问而获得智能提示。

注意点:对于没有导入导出语句的普通文件,这里的能被访问只是表现层面的可以访问(也就是能获取它的智能提示),逻辑层面其实并不能。所以为了达到表现和逻辑的统一,可以通过window这个全局对象来处理。如下,怎么简洁优雅的写一个全局单例模块用于封装通用api:

11fed3bb04de470ab76978e341f79148.png

上述文件1处定义了一个单例对象GNum,GNum是一个顶层数据,根据上面的分析,其他文件可以获取GNum的智能提示。当我们在其他文件输入GNum的时候可以获得这个对象及其下面所有公有函数和属性的智能提示,之所以用 new class 这种匿名类的写法是不想额外暴露一个我们没必要暴露的类名给外面。

这个时候其他文件就可以获取GNum的智能提示了,但是逻辑上GNum并不是全局的,怎么把智能提示的表现和逻辑统一呢?请看关键的一句2,2处定义了一个window下面的属性“GNum”指向GNum,此时当我们在一个文件里面输入GNum的时候,智能提示其实是1处的,但是逻辑用的又是window下面的“GNum”,“GNum”指向1处的GNum, 所以这样就做到了逻辑和表现的统一了,如下:

f92b52c9d0dff31f1d6a039fce660ae3.png

运行结果:

dcad90a5137ff9941c0b82445f4b7a2c.png

这样写出来的全局模块,简洁优雅,智能提示充足,其他任意文件可以直接调用api而不需要写各种import语句,就像调用cc.xxx这样的引擎api一样自然。

tips:其实cc的api也是用了一个creator.d.ts来达到表现和逻辑的统一。逻辑是在引擎代码里面实现的,而我们看到的智能提示则是 creator.d.ts 这个文件,ctrl + 左键 也会跳转到这里。

根据上面的分析,如果你在 creator.d.ts 里面加一个import或者export语句,你其他文件就不能直接获取不到cc的智能提示了,以前写的cc.xx代码会报错,但是并不影响运行,因为cc的逻辑在引擎代码里面,读者可以自己尝试。

像这种实现和声明分离的做法一般用于第三方js插件什么的,如protobufjs.js,引入工程后,逻辑有了,你直接调用里面的api,虽然会提示代码错误,但是逻辑并不会有问题,运行不报错。这个时候就可以通过写对应的.d.ts文件来补足它的智能提示,达到表现和逻辑统一的效果。

对于我们自己的工程文件,模块文件来说,还是推荐用上面的 GNum的写法,实现逻辑和智能提示写在一起,既有充分的智能提示,又不需要写额外的.d.ts,这才是脚本语言的魅力(比java,c++简洁,灵活)。

3.智能提示的写法

03583aaafab4dd525620b9d3602531d6.png

jsdoc注释(/** */)写法的智能提示可以被很好的展示,普通的注释(//)则没有这个功能,所以为了获取良好的智能提示效果,尽可能的写 jsdoc注释(/** */)吧。jsdoc注释的写法读者可以自行百度,这里就不展开说了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值