1--Debug版本和Release版本

区别:

①Debug版本称为调试版本,其包含调试信息,编译过程中不进行优化,便于调试;

②Release版本成为发布版本,编译过程中会进行优化,执行更高效。

g++针对上述两个版本提供了不同的指令:

①Debug版本:

g++ say_hi.cpp -o say_hi.out -W -Wall -g -std=c++17
g++ <filename>.cpp <other_cpp_files> -o <filename>.out -W -Wall -g -std=c++17

②Release版本:

g++ say_hi.cpp -o say_hi.out -W -Wall -O2 -std=c++17
g++ <filename>.cpp <other_cpp_files> -o <filename>.out -W -Wall -O2 -std=c++17

解释上述参数的意义:

①<filename>.cpp: 要编译的.cpp文件;

②<other_cpp_files>: 链接的.cpp文件;

③-o <filename>.out: 编译好的执行文件;

④-W -Wall: 错误信息提示;

⑤-g: 开启调试选项(即Debug版本);

⑥-O2: 开启编译优化(即Release版本);

⑦-std: 采用的C++标准;

2--tasks.json和launch.json

①tasks.json配置文件:

{
    "version": "2.0.0",  // 配置文件的版本
    "tasks": [
        // task1
      {
        "label": "g++ compile", // task1任务的别名
        "type": "shell",// shell or process
        "command": "g++", // 任务要执行的command,C++为g++,C为gcc
        "args": [ // g++命令的参数
          "${file}", // 当前打开的文件,表示当前要编译的文件(绝对路径)
          // 在这里添加你还需要链接的.cpp文件
          //"hello.cpp",
          "test.cpp", // hello.cpp需要引用test.cpp中的函数
          "-o", //
          // fileDirname: 当前打开文件的目录名
          // fileBasenameNoExtension: 当前打开文件的基本名称(不带文件扩展名)
          "${fileDirname}/${fileBasenameNoExtension}.out",
          "-W", // g++ 错误信息提示
          "-Wall",
          "-g", // g++开启调试选项
          "-std=c++17", // g++采用的C++标准
        ],
        "group": {
          "kind": "build",
          "isDefault": true, // 在本group中是否为默认任务
        },
        "presentation": {
          "echo": true, // 打开可以看到编译的命令,把命令本身输出一次
          "reveal": "silent", // 控制在集成终端中是否显示。如果没问题那我不希望终端被切换、如果有问题我希望能看到编译过程哪里出错,所以选silent(可能always会好一些)
          "focus": false, // 是否将鼠标移过去。因为是编译任务,不需要输入什么东西,所以设置为false
          "panel": "shared", // shared:不同任务的输出使用同一个终端panel
          "showReuseMessage": true, // 默认输出一句话,输出就true,否则就false
          "clear": false, // 是否保留之前任务的输出信息
        },
        "options": {
          "cwd": "${workspaceFolder}", // 默认
        },
        // problemMatcher: 用正则表达式提取g++的输出中的错误信息并将其显示到VS Code下方的Problems窗口
        // 保持默认就好
        "problemMatcher": {
          "owner": "cpp",
          "fileLocation": "absolute",
          "pattern": {
            "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
            "file": 1,
            "line": 2,
            "column": 3,
            "severity": 4,
            "message": 5,
          },
        },
      },
      // task2
      {
        "label": "Open Terminal.app", 
        "type": "shell",
        "command": "osascript -e 'tell application \"Terminal\"\ndo script \"echo now VS Code is able to open Terminal.app\"\nend tell'",
        "problemMatcher": [],
        "group": "none",
      }
    ]
  }

注:上述配置文件中,主程序main()在hello.cpp中,hello.cpp将引用test.cpp中的函数。根据个人习惯,也可以进行以下修改:注释掉"${file}",解除注释"hello.cpp",即指明要编译的两个.cpp文件。上述的tasks.json文件,需要打开hello.cpp,在hello.cpp的展示页面上进行编译运行,否则会报错,所以更建议注释掉"${file}",指明要编译的所有.cpp文件。

②launch.json配置文件

{
    "version": "0.2.0",
    "configurations": [
      {
        "type": "cppdbg", // C++ debug
        // 若debug的时候,项目已启动,则设置为attach
        // 若debug和启动项目的时机相同,则设置为launch
        "request": "launch", // debug的类型,launch表示启动,attach表示附加
        "name": "C++ Debug", // 在VSCode侧边栏Run那里显示的名称(人为设定)

        "preLaunchTask": "g++ compile", // 在debug之前要进行的任务即compile,需与tasks.json中编译任务的label相同
        "program": "${fileDirname}/${fileBasenameNoExtension}.out", // debug的对象(-g编译出来的二进制文件),需与.vscode/tasks.json中生成的可执行文件一致
        "args": [], // 运行可执行程序需要添加的输入参数(argc/argv)
        "environment": [], // 放置环境变量
        "cwd": "${workspaceFolder}", // 当前工作目录
        "stopAtEntry": false, // 设为true时程序将暂停在程序入口处,相当于在main中打断点
        "externalConsole": true,  // 是否使用额外的终端,否则使用内置终端
        "MIMode": "lldb", // 指定连接的调试器,gdb或lldb
      }
    ]
  }

注:在Windows或Linux系统下,往往不需要使用额外的终端,即"externalConsole"设置为false,而在Mac系统下需要使用额外的终端,所以要设置为true。

3--相对路径./和../

A
       ├─ B
       │    ├─ b1 
       │    ├─ b2 
       │    └─ b3
                └─ b4 
       └─ C
              ├─ c1
              ├─ c2
              ├─ c3

①b1引用b2,只需要直接引用对应的文件名即可,或./b2;

②b1引用b4,需要使用./b3/b4的相对路径;

③b1引用c1,需要使用../C/c1的相对路径;

④b4引用c1,需要使用.../C/c1的相对路径;