本文地址:https://www.cnblogs.com/jqdy/p/12565161.html
习惯了VS的强大编辑功能,对Keil 5越来越深恶痛绝。查阅网络文章后按图索骥初步实现了VS编辑Keil项目的功能,但是VS仍然不识别sfr、sbit、bit等特有关键字。虽然不是大问题,但是当键入STC8.h中定义的相关寄存器名称时,不能使用自动提示功能,成了比较大的缺憾。尝试再三,利用条件编译终于让VS识别了sfr等特有关键字,并实现了自动提示功能。
第一步:模拟Keil5中的项目结构,在VS中建立一个解决方案。
这不是让VS编译Keil项目,而是方便在VS中打开项目中的各个文件进行编辑。下面,每个操作步骤一张图片。
1. 创建新项目
2. 选定空项目
3. 确定项目名称和目录
名称和目录随意,不过为了避免产生混淆,名称最好和Keil中的项目名称一致或类似,目录位置最好也和Keil的.uvproj放在一起,或在之下再建一个专门的vs项目目录。总之,原则就是即要与Keil项目相呼应,又要分开放置,避免混淆。
4. 添加有关.c和.h文件
在“解决方案资源管理器”中,右击“源文件”-“添加”-“新建项”或者“现有项”,找到Keil项目所在目录或者其下的子目录,添加或者新建Keil项目所使用的".c"文件。同样,处理“解决方案管理器”中的“头文件”,添加或者新建相关的“.h”文件。这样就把所需的.c和.h文件添加完毕了,添加完毕后保存。
这时,从vs项目所在文件夹中可以看到VS特有的.sln、.vcxproj等文件和Debug目录,这些都是VS使用,但Keil不用的,所以,为了避免混淆,最好将VS和Keil文件放在不同的目录。注意这里所说的“VS使用,但Keil”不用,仅仅针对于.sln和.vcxproj等文件,对于刚才在“解决方案管理器”中添加的.c和.h文件,两者是共用的,均保留在原Keil项目目录下。在后续使用VS编辑相关文件并保存后,切换到Keil中,Keil会提示相关文件已经改变,是否重新加载,重新加载就会发现VS编辑的内容了。
第二步:让VS可以自动找到芯片头文件和项目头文件。
5. 设置VS项目的默认头文件目录,
目的是在VS中建立头文件搜索路径,好在各个.c和.h文件之间自动建立关联。
5.1 在“解决方案管理器”中鼠标右击该项目-属性。
5.2 在弹出的“属性页”窗口中,先后选择:VC++目录-包含目录-右面的下拉箭头-编辑,弹出“包含目录”对话框
5.3 添加默认包含文件所在的目录
在弹出的“包含目录”对话框中,点击看上去像文件夹一样的第一个图标,这时,下面就多出来一个空行,再点击空行右边的“...”图标。这样就出现了常规的“选择目录”对话框,因属常规操作就不再贴图了。
这里要强调的是,要添加头文件的包含目录有三个。
第一个是C51标准库的头文件所在目录,我的机子中这个目录是“C:C:Keil_v5C51INC”。
第二个是所使用芯片的.h文件所在目录,例如我是用的STC8.h,这个头文件在安装Keil的目录内,例如下图第一个白框中显示半行的哪个目录,在我的电脑中具体是“C:Keil_v5C51INCSTC”,这样就可让VS找到项目c文件中#include <stc8.h>所指的stc8.h了,编辑时VS就可自动提示stc8.h中的内容了。
第三个要添加的目录是你这个项目中自己添加的.h文件所在的目录,如果这些.h文件放置到多个目录中,还要逐个添加进来,这样VS就可找到项目c文件中自定义的那些头文件了,这些头文件形如#include "stc8_abc.h"。
至此,网络上提供的办法就结束了。但是,VS仍然不认sfr、sbit、bit等C51特有的数据类型,在这些类型下面有红色波浪线的提示到在其次,主要问题是VS不认这些数据类型,编辑时的自动提示中就不会出现这些内容。
第三步:让VS识别sfr、sbit、bit。
6. 让VS识别sfr、sbit、bit等数据类型,进而在编辑时可进行自动提示。
这里用到的主要是预处理中条件编译的相关内容,有2个方面的工作需要做。
6.1 在VS的“预处理器”中加入特有的预处理器定义符号
我这里加入的是“_keil_vs_”,这个符号怎么写不重要,重要的是keil中永远用不到即可。这个符号仅仅加在VS项目中,而不加入到Keil编辑器中,要达到这样的目的:使用这个标记定义的内容只有VS认识,keil不认识。
在5.2中“属性页”中不进入“VC++目录”,而是进入“C/C++”-预处理器-预处理器定义-右边下箭头-编辑,在“预处理器定义”对话框中输入这个符号,然后保存退出。
6.2 在Keil安装目录找到所使用芯片的.h文件,并进行修改。
如5.3所述,我使用芯片的.h文件,在“C:Keil_v5C51INCSTC”内,文件名是“STC8.h”。开打这个文件,在文件开头键入以下内容。
#ifdef _keil_vs_ typedef unsigned char sfr;//仅用于vs编辑Keil文件 typedef unsigned char sbit;//仅用于vs编辑Keil文件 typedef unsigned char bit;//仅用于vs编辑Keil文件 #endif // _keil_vs_
下面贴个图:
其中,最关键的就是使用 #ifdef 判断预处理器中是否定义了_keil_vs_这个符号了。
对于VS,刚才已经在预处理器中进行了定义,所以对于VS来说sfr、sbit、bit就被typedef为unsigned char类型了,VS遇到这几个类型就会认为是unsigned char类型,这样就实现了VS识别的目的,也能进行自动提示了。
对于keil来说,因为并没有将_keil_vs_这个符号添加进预处理器,所以这几个在#ifdef/#endif中包含的几个typedef不起任何作用。这样,就实现了VS和Keil的兼顾,VS既能识别并自动提示,又不对keil产生任何影响。
实际上,可以typedef为任何vs识别的类型,不一定必须是unsigned char。如果有其他类似需要也可按此处理。
至此,大功告成!
下面贴一个效果图,当键入sbu过程中,VS会出现SBUF的自动提示: