入门,首先看我这两篇博客:关于QScintilla库的入门大全https://biao2488890051.blog.csdn.net/article/details/126798996?spm=1001.2014.3001.5502
关于编辑器QScintilla(Scintilla)词法分析器工作原理的分析(实现注释区分)_我是标同学的博客-CSDN博客
知道了词法分析器的工作原理后,我们从 QScintilla_src-2.12.1\scintilla\lexers\LexCPP.cpp 源码中可以看到,是由 &OptionsCPP::trackPreprocessor 来控制是否编辑器跟踪宏,从而进行非活动代码控制的。此外,另一个 &OptionsCPP::updatePreprocessor 也把它给关掉,它是动态更新宏的,比如本编辑器中现在定义了一个宏,那么这个词法分析器就能知道,然后更新对应的非活动代码显示情况了。
看了源码,发现对于头文件,是不分析的,也就是头文件里面定义了宏啥的,本文档内是根本不知道的,所以这个宏追踪功能,其实就没啥用了,因为c语言工程,很喜欢把宏定义在头文件中,而且头文件还会嵌套的。由于代码只能提示,也是由这个词法分析器完成的,所以头文件里面定义的函数也是无法智能提示出来的。本文后面会讲解决方法。
所以我们关闭这两个变量即可,通过如下代码:
SendScintilla(SCI_SETPROPERTY, "lexer.cpp.track.preprocessor", "0");
SendScintilla(SCI_SETPROPERTY, "lexer.cpp.update.preprocessor", "0");
当然,如果我们还是想要编辑器QScintilla能准确的提示非活动代码,怎么办呢,我们可以找第三方工具(比如gcc的预处理器),分析出头文件中包含的所有宏,然后写入keyword 5,就能告诉QScintilla当前编辑器具备哪些已有的宏定义啦。智能代码提示的头文件里的关键字,也这样的方式来搞喔。
关于keyword的说明,如下:
这个是需要在QScintilla这边的QsciLexerCPP类重新实现函数keywords(int set)即可(因此我们需要自定义一个类继承QsciLexerCPP才行,这个和重写一个词法分析器不一样,重写用的是继承另一个类 QsciLexerCustom https://qscintilla.com/#syntax_highlighting/lexer_basics)。此外,也可以加入更多的词,来让智能代码提示更加的完善。