合成包含递归的头文件

dev*_*nut 18 c++ vim syntastic

我正在使用C++项目并尝试将其配置为使用合成.在我的项目中,我有一个嵌套的头文件目录结构(实际的嵌套结构更糟糕,这是一个例子).

--libs    
    |---dir1
         |---foo1.h    
    |---dir2
         |---foo2.h
         |---foo3.h
         |---dir3
               |---foo4.h
Run Code Online (Sandbox Code Playgroud)

我使用以下命令将lib文件包含在我的.vimrc文件中:

让g:syntastic_cpp_include_dirs = ['libs /']

我假设这会以递归方式获取所有头文件,但事实并非如此.在代码中,syntastic抱怨错误'找不到这样的文件或目录'.

当我显式更改变量以引用特定目录时:

让g:syntastic_cpp_include_dirs = ['libs/dir2/dir3 /']

有用.

我的问题:

  1. 如何配置合成,以便它包括递归的一组目录的头文件?
  2. 你如何为多个项目做到这一点?当我切换我正在处理的项目时,总是编辑.vimrc听起来不对.我相信一定有更好的方法.

编辑:

我没有在我的.vimrc中提到,以下选项适用于syntastic:

let g:syntastic_check_on_open=1
let g:syntastic_enable_signs=1
let g:syntastic_cpp_include_dirs = ['libs/dir2/dir3', 'libs/dir2 ]
let g:syntastic_cpp_check_header = 1
let g:syntastic_cpp_remove_include_errors = 1
Run Code Online (Sandbox Code Playgroud)

vvn*_*man 32

您可以在文件的项目根目录中包含要搜索的每个项目的头文件的所有目录.syntastic_cpp_config.这样做的格式与向-I编译器提供指令的格式相同.

对于您的情况,它意味着:

  • 创建一个文件.syntastic_cpp_configsources(假设这就是你的代码,并sources在该目录层次结构中的相同深度的水平libs).
  • 在其中添加以下行:

    -Ilibs/dir1

    -Ilibs/dir2

    -Ilibs/dir2/dir3

  • 请注意,每行标志为1.

  • 这样您就不必拥有所有包含目录.vimrc.

您可以使用不同的文件来保存每个项目的自定义配置,例如,由.vimrc全局变量指定g:syntastic_cpp_config_file

let g:syntastic_cpp_config_file = '.my_custom_include_file_for_syntastic'
Run Code Online (Sandbox Code Playgroud)

Syntastic将检查每个源目录及其向上,直到找到此文件,然后使用它来生成其输出.

有关更多详细信息,请参见Syntastic wiki页面, 旧链接.

  • 这是[2018年5月24日更新](https://github.com/vim-syntastic/syntastic/issues/2179)过时的.`.syntastic_cpp_config`不再是"魔法",你必须用`let g:syntastic_cpp_config_file = ...`明确设置. (4认同)