VSCode como editor de C++

Nota del autor: El presente artículo se encuentra desactualizado. El lector puede encontrar una introducción más actual a la gestión de proyectos de C++ en VSCode en la serie de posts 'Integrando VSCode, Mingw-w64 y CMake' publicada en agosto de 2019 y revisada periódicamente desde esa fecha.

Visual Studio Code 

VSCode es un editor gratuito y de código abierto –si bien la descarga oficial se realiza bajo una licencia de software propietario– desarrollado desde 2015 por la compañía Microsoft para las plataformas Linux/MS Windows/macOS. Proporciona, entre otras funcionalidades, un alto grado de configuración por parte del usuario, resaltado de sintaxis, soporte para debugging, autocompleción e información de código (IntelliSense) y control integrado de Git. Fue declarado el entorno más popular entre desarrolladores en el Stack Overflow 2018 Developer Survey.

En este artículo, describiremos brevemente cómo configurar un proyecto de C++ en VSCode en el caso específico de MS Windows. Los pasos a dar en otros sistemas operativos serían análogos. Asumiremos que nuestro equipo dispone de un compilador mingw-w64 actualizado (con soporte para C++17) y que éste se encuentra incluido en el PATH del sistema.
Nota: Una distribución particularmente sencilla de instalar es la facilitada por MinGW-w64-builds. Ésta contiene el compilador G++ 8.1, que proporciona un soporte casi completo para el estándar ISO C++2017, así como soporte experimental para ISO C++2020. Instala el compilador en la dirección que consideres más conveniente, por ejemplo C:\mingw-w64\. Incluye entonces la dirección C:\mingw-w64\mingw32\bin (o similar) en la variable PATH del sistema.

Configuración

Procederemos en la forma siguiente:

1. Instala y ejecuta VSCode. Una vez dentro, pulsa la combinación de teclas Ctrl+Shift+X para desplegar el menú lateral de extensiones del editor. Realiza la búsqueda 'C/C++' y selecciona la herramienta (normalmente la primera en la lista) 'C/C++ [ms-vscode.cpptools] IntelliSense, debugging, and code browsing' desarrollada por Microsoft (ver imagen inferior). Pincha sobre 'Install' y después sobre 'Reload'.

Nota: La secuencia Ctrl + K Ctrl + T te permitirá escoger diversos temas de color (claros y oscuros). Podremos también encontrar multitud de estilos adicionales a través del gestor de extensiones.
2. Acude al menú 'File->Open folder...' para iniciar un nuevo proyecto de C++. Aparecerá una ventana desde la que podrás seleccionar la carpeta donde almacenar los distintos ficheros del proyecto; de no existir previamente, créala en la ubicación que consideres más conveniente pulsando el botón derecho del ratón y seleccionando "Nuevo->Carpeta", tal y como harías en un explorador de archivos habitual. A lo largo de este artículo, asumiremos que dicha carpeta toma como título 'Prueba'.

3. Observarás la aparición del folder 'Prueba' en el menú de exploración, carente de contenidos en un principio. Sobrevuela su título con el ratón y pulsa sobre el icono 'New File' para generar un archivo de código fuente main.cpp:


Codifica en él el programa clásico 'Hello world':


En principio, el editor debería ser capaz de reconocer la existencia del compilador automáticamente. Si no fuese así, la directiva de inclusión #include <iostream>  aparecería subrayada en rojo. Tanto si se producen incidencias como si no, es recomendable abrir el Command Palette del editor con la combinación de teclas Ctrl+Shift+P y ejecutar el comando >C/Cpp: Edit configurations. Se generará así automáticamente el fichero c_cpp_properties.json en la subcarpeta .vscode de nuestro folder. En el caso del compilador mingw-w64, su contenido debiera ser análogo al proporcionado en el marco inferior (la dirección específica del "compilerPath" dependerá de tu instalación del compilador):


{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "C:\\mingw-w64\\mingw32\\bin\\gcc.exe",
            "intelliSenseMode": "gcc-x64",
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}

4. Al intentar realizar un primer build del programa mediante la combinación Ctrl+Shift+B, el editor te informará de la inexistencia de un archivo de tarea (task) para el proyecto:



Pincha sobre el mensaje. Se te proporcionará la opción de generar un archivo task.json desde una plantilla:


Pincha sobre el mensaje y, de las distintas opciones ofrecidas, escoge 'Others':


Sustituye el contenido del task.json (generado por defecto en la subcarpeta .vscode) por el siguiente objeto, que especificará las opciones de compilación básicas de nuestro proyecto; no olvides pulsar Ctrl+S para hacer efectivos los cambios:

{
   // See https://go.microsoft.com/fwlink/?LinkId=733558
   // for the documentation about the tasks.json format
   "version": "2.0.0",
   "tasks": [
       {
           "label": "Prueba",
           "type": "shell",
           "command": "g++",
           "args": [
               "-std=c++17",
               "-Wall", "-pedantic", "-Wextra",
               "-O2",
               "-o", "result",
               "main.cpp"
           ],
           "group": {
               "kind" : "build",
               "isDefault": true
           }
       }
   ]
}

Puedes ya proceder a compilar el programa 'Hello world' mediante la combinación Ctrl+Shift+B, controlando la evolución del proceso de compilación desde la terminal que se despliega automáticamente en la parte inferior del editor. En este caso, el ejecutable generado al compilar main.cpp se llamará result.exe. Para poder ejecutarlo, pincha sobre el icono '+' en el margen superior derecho de la terminal para acceder al CMD:



Configuración de bibliotecas no-estándar

Consideremos ahora la posibilidad de utilizar bibliotecas no-estándar ampliamente extendidas en la comunidad C++ tales como Boost, Range-v3, {fmt}lib, nlohmann's JSON, Howard Hinnant's Date/Time Zone, blaze-lib, etcétera. En particular, modifiquemos nuestro programa 'Hello world' con el fin de emplear la biblioteca de formato {fmt}lib, un subconjunto de la cual se encuentra en proceso de estandarización para C++20. Por simplicidad, asumiremos que la biblioteca se encuentra descargada en la dirección "C:\fmt-master\":

#define FMT_HEADER_ONLY
#include <fmt/format.h>

auto main() -> int
{
   fmt::print("Hello {} world!\n", "C++");
}

IntelliSense no reconocerá inicialmente la directiva de inclusión del fichero de cabecera <fmt/format.h>, subrayándola en rojo. Si pinchas con el ratón sobre la línea, aparecerá un icono con forma de bombilla en su zona izquierda:



Pincha sobre dicho icono y selecciona la opción edit "includePath" setting. Ello te remitirá nuevamente al fichero de configuración c_cpp_properties.json, donde podrás añadir la dirección de inclusión de la biblioteca en el campo "includePath" (observa que los elementos de la lista deben separarse por comas):

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "C:\\fmt-master\\include"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "C:\\mingw-w64\\mingw32\\bin\\gcc.exe",
            "intelliSenseMode": "gcc-x64",
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}

Asimismo, acude al fichero task.json para actualizar el comando de compilación:

{
   // See https://go.microsoft.com/fwlink/?LinkId=733558
   // for the documentation about the tasks.json format
   "version": "2.0.0",
   "tasks": [
       {
           "label": "Prueba",
           "type": "shell",
           "command": "g++",
           "args": [
               "-std=c++17",
               "-Wall", "-pedantic", "-Wextra",
               "-O2",
               "-o", "result",
               "main.cpp",
               "-I", "C:\\fmt-master\\include"
           ],
           "group": {
               "kind" : "build",
               "isDefault": true
           }
       }
   ]
}

El proyecto quedará así listo para su compilación a través de la combinación Ctrl+Shift+B. En próximos posts analizaremos el soporte de VSCode para tareas de debugging. Puedes encontrar más información acerca de la programación en C y C++ en Visual Studio Code en la dirección oficial:

https://code.visualstudio.com/docs/languages/cpp

3 comentarios:

  1. Muchas gracias Daniel, muy útil y fácil de seguir.

    ResponderEliminar
  2. Hola!, muy buen post me ha servidor bastante, hace pocos dias que estoy luchando por compilar C++ en linux con VSC, aun lucho con la documentacion oficial pero logro hacerlo andar, queria hacerte algunas preguntas.

    * Como deberia hacer si tengo mas de un .cpp/.c? ejemplo sqlite.c, lo agrego en c_cpp_properties.json o en task.json?
    * Como agrego al editor el archivo .c/.cpp externo a mi aplicacion, boost por ejemplo u otras librerias .c que se encuentras en otros directorios fuera del entorno de trabajo?
    * Por cada archivo .c/.cpp tengo que hacer una entrada igual en tasks?
    * Que deberia agregar a este ejemplo para que compile 2 o 3 o n archivos .cpp?

    Desde ya, mil gracias.

    ResponderEliminar
  3. Hola Fabricio:

    Disculpa la tardanza en contestar. Cualquier fichero .cpp adicional que debas compilar debería introducirse, efectivamente, en el task.json, junto al 'main.cpp'. Dicho JSON, que sería único para todo proyecto, gestionaría así su compilación.

    Por ejemplo, en el último punto del post, si optáramos por utilizar la biblioteca {fmt}lib sin la macro FMT_HEADER_ONLY, deberíamos añadir al fichero task.json el archivo fuente format.cc de dicha biblioteca necesario para la compilación del proyecto:

    "-std=c++17",
    "-Wall", "-pedantic", "-Wextra",
    "-O2",
    "-o", "result",
    "main.cpp",
    "C:/fmt-master/src/format.cc"

    Mi intención es que el próximo post trate sobre la gestión de proyectos en VSCode mediante CMake, lo que facilita enormemente la compilación en distintas plataformas, así como el empleo de bibliotecas de uso extendido como Boost.

    Saludos.

    ResponderEliminar