搭建好GNU C环境后,如何集成到VSCode呢? 这里一步步教你如何做。
第一步 设定PATH环境变量
MSYS2安装目录默认在C:\msys64,通过pacman安装的gcc、make、gdb都在目录 C:\msys64\usr\bin下。
设置环境变量,便于vscode找得到相关文件
第二步:安装vscode插件C++
为vscode安装C/C++扩展
第三步: 使用task.json、 launch.json配置vscode环境
vscode打开一个工作目录,在此工作目录下创建一个.vscode目录,在.vscode目录下创建task.json文件,lauch.json文件,分别如下:
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "make",
            "type": "shell",
            "command": "cd ${workspaceFolder}/code/c/  ; make",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": "$gcc"
        },
        {
            "label": "gcc build active file",
            "type": "shell",
            "command": "gcc",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.exe"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": ["$gcc"]
        }
    ]
}{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "GCC Buid and Debug C/C++",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}\\code\\c\\exe\\${fileBasenameNoExtension}.exe",
            "args": ["100" ,"1000", "1"],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}/code/c/",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "preLaunchTask": "make",
            "miDebuggerPath": "c:/msys64/mingw64/bin/gdb.exe",  // 根据您的安装路径调整
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "sourceFileMap": {
                "": "${workspaceFolder}\\code\\c\\src\\"
            }
        }
    ]
}第四步 :编辑c代码、makefile
$ tree -L 1
.
├── exe
├── makefile
├── obj
└── src
在src中添加一个文件test_yaml.c,如下:
#include 
#include 
#include 
#include 
#include 
void read_yaml(const char *filename) {
    FILE *file = fopen(filename, "r");
    if (!file) {
        perror("Failed to open file");
        return;
    }
    yaml_parser_t parser;
    yaml_event_t event;
    // Initialize the parser
    if (!yaml_parser_initialize(&parser)) {
        fprintf(stderr, "Failed to initialize parser!\n");
        fclose(file);
        return;
    }
    yaml_parser_set_input_file(&parser, file);
    // Parse the YAML file
    while (1) {
        if (!yaml_parser_parse(&parser, &event)) {
            fprintf(stderr, "Parser error %d: %s\n", parser.error, parser.problem);
            break;
        }
        // Handle the events
        switch (event.type) {
            case YAML_MAPPING_START_EVENT:
                printf("Mapping start\n");
                break;
            case YAML_MAPPING_END_EVENT:
                printf("Mapping end\n");
                break;
            case YAML_SCALAR_EVENT:
                printf("Scalar: %s\n", event.data.scalar.value);
                break;
            case YAML_SEQUENCE_START_EVENT:
                printf("Sequence start\n");
                break;
            case YAML_SEQUENCE_END_EVENT:
                printf("Sequence end\n");
                break;
            default:
                break;
        }
        // Break on the end of the document
        if (event.type == YAML_STREAM_END_EVENT || event.type == YAML_NO_EVENT) {
            break;
        }
        // Free the event
        yaml_event_delete(&event);
    }
    // Cleanup
    yaml_parser_delete(&parser);
    fclose(file);
}
void print_data(const char *old_data, const char *new_data) {
    // 清屏
    printf("\033[H\033[J"); // ANSI 转义序列,清屏
    printf("Data:\n");
    // 获取数据的最大长度
    size_t max_length = strlen(old_data) > strlen(new_data) ? strlen(old_data) : strlen(new_data);
    for (size_t i = 0; i < max_length; i++) {
        // 检查 old_data 和 new_data 的每个字符
        char old_char = (i < strlen(old_data)) ? old_data[i] : ' ';
        char new_char = (i < strlen(new_data)) ? new_data[i] : ' ';
        if (new_char != old_char) {
            // 如果字符不同,标记为红色
            printf("\033[31m%c\033[0m", new_char); // 红色
        } else {
            // 如果字符相同,正常输出
            printf("%c", new_char);
        }
    }
    printf("\n");
}
int main() {
    const char *filename = "config.yaml";
    read_yaml(filename);
    return 0;
}     然后通过vscode,启动调试:按F5或者点选菜单RUN-start debug
在代码编辑视图中设置断点
会先执行make,然后进入调试。
