0


在vscode中使用C++模块和代码补全

本示例使用 cmake 3.29.0, gcc14.1.0(必要), ninja1.12.0

vscode c/c++插件版本1.20.5

这个版本的插件仍不支持c++ module的代码补全,但可以通过宏欺骗C++ IntelliSense并使用代码补全。

在cmake中使用c++模块

  1. # in CMakeLists.txt
  2. ...
  3. file(GLOB MODSRC *.ixx)
  4. target_sources(modules
  5. PUBLIC
  6. FILE_SET CXX_MODULES FILES
  7. ${MODSRC}
  8. )
  9. target_compile_features(modules PUBLIC cxx_std_20)
  10. add_executable(${PROJECT_NAME} main.cpp)
  11. target_link_libraries(${PROJECT_NAME} modules)
  12. ...

使用cmake成功构建项目后,编译器可以正常编译但vsdcode不支持代码补全,非常难用。

实现代码补全

vscode只支持头文件的代码补全, 所以模块的实现需要放在头文件中,而在模块文件中导入头文件并编译。

目录结构:

.
├── build
├── CMakeLists.txt
├── core.h
├── core.ixx
└── main.cpp

core.h

  1. ...
  2. #ifndef BUILD_IN_MODULE // 通过此宏区别使用模块构建还是传统头文件引入
  3. #define EXPORT
  4. #else
  5. #define EXPORT export
  6. #endif
  7. #ifndef BUILD_IN_MODULE // 若不使用模块则导入头文件, 否则不导入任何头文件(头文件在模块文件中导入)
  8. #include <iostream>
  9. #endif
  10. EXPORT struct YourStruct{
  11. void func(){
  12. std::cout << "hello world\n";
  13. }
  14. };
  15. EXPORT void foo(){
  16. std::cout << "foo()\n";
  17. }
  18. ...

core.ixx

  1. module;
  2. #include <iostream> // core.h 所需的头文件在此处包含
  3. #define BUILD_IN_MODULE // 定义此宏后,包含的core.h中的EXOPRT将变为export关键字
  4. export module core;
  5. #include "core.h"

main.cpp

  1. #ifndef IMPORT_MODULE
  2. #include "core.h"
  3. #else
  4. import core;
  5. #endif
  6. int main() {
  7. ...
  8. return 0;
  9. }

此处IMPORT_MODULE宏将在编译时定义, 在CMakeLists.txt中增加:

  1. add_compile_definitions(IMPORT_MODULE)

由于vscode IntelliSense不知道此宏存在,所以其前端编译器导入了头文件并提供代码补全,而由于IMPORT_MODULE已定义,g++编译时使用import core;而不是#include<core.h>。

效果

可以正常debug:

在不定义IMPORT_MODULE宏的状态下,core.h也可以作为正常头文件直接导入并使用。

模块的使用可以极大加速编译,避免对头文件的冗余的扫描,头文件越大,使用模块带来的速度增加越明显。

注意

若vscode正确的导入了CMake中定义的宏,则需要删除.vscode目录下c_cpp_properties.json中的"configurationProvider": "ms-vscode.cmake-tools",或将如下位置字段删除:

缺点是这样做会导致IntelliSense无法得到你在cmake中自定义的文件包含路径等,你需要在c_cpp_properties.json的includePath中加入它们以获得正确的头文件解析。

标签: c++ c++20 vscode

本文转载自: https://blog.csdn.net/ju2237jinQ/article/details/139868897
版权归原作者 juCPP 所有, 如有侵权,请联系我们删除。

“在vscode中使用C++模块和代码补全”的评论:

还没有评论