¿Cómo uso los módulos de C++ en Clang?

 C Programming >> Programación C >  >> Tags >> Clang
¿Cómo uso los módulos de C++ en Clang?

A partir de este compromiso, Clang tiene soporte experimental para los Módulos TS.

Tomemos los mismos archivos de ejemplo (con un pequeño cambio) que en la publicación del blog de VS sobre la compatibilidad con módulos experimentales.

Primero, defina el archivo de interfaz del módulo. De forma predeterminada, Clang reconoce archivos con cppm extensión (y algunas otras) como archivos de interfaz de módulo de C++.

// file: foo.cppm
export module M;

export int f(int x)
{
    return 2 + x;
}
export double g(double y, int z)
{
    return y * z;
} 

Tenga en cuenta que la declaración de la interfaz del módulo debe ser export module M; y no solo module M; como en la entrada del blog de VS.

Luego consuma el módulo de la siguiente manera:

// file: bar.cpp
import M;

int main()
{
    f(5);
    g(0.0, 1);
    return 0;
}

Ahora, precompila el módulo foo.cppm con

clang++ -fmodules-ts --precompile foo.cppm -o M.pcm

o, si la extensión de la interfaz del módulo no es cppm (digamos ixx , como sucede con VS), puede usar:

clang++ -fmodules-ts --precompile -x c++-module foo.ixx -o M.pcm

Luego construye el programa con

clang++ -fmodules-ts -c M.pcm -o M.o
clang++ -fmodules-ts -fprebuilt-module-path=. M.o bar.cpp

o, si el nombre del archivo pcm no es el mismo que el nombre del módulo, deberá usar:

clang++ -fmodules-ts -fmodule-file=M.pcm bar.cpp

Probé estos comandos en Windows usando la compilación r303050 (15 de mayo de 2017).

Nota:Al usar el -fprebuilt-module-path=. opción, recibo una advertencia:

lo que parece ser incorrecto porque sin esa opción, el módulo M no se encuentra.


Como mencionaste, clang aún no tiene una sintaxis de C++ para importaciones, por lo que dudo que #include las directivas van a ser literalmente reescrito como importaciones al preprocesar un archivo, por lo que puede que no sea la mejor manera de probar si los módulos funcionan según lo previsto.

Sin embargo, si configura -fmodules-cache-path=<path> explícitamente, puede observar que clang lo llena con archivos de módulos precompilados (* .pcm) durante una compilación, si hay módulos involucrados.

Deberá usar libc++ (que parece venir con un module.modulemap a partir de la versión 3.7.0) si desea usar una biblioteca estándar habilitada para módulos en este momento, aunque en mi experiencia esto no funciona completamente todavía. (También se supone que el compilador C++ de Visual Studio 2015 obtendrá algún tipo de soporte de módulo con la Actualización 1 en noviembre)

Independientemente de stdlib, aún puede usar módulos en su propio código. Los documentos clang contienen una descripción detallada del lenguaje del mapa del módulo.