2015-10-23 2 views
26

I moduli sono un'alternativa a #inclusi. Clang has a complete implementation for C++. Come potrei andare se volessi usare i moduli usando Clang ora?Come utilizzare i moduli C++ in Clang?


Uso

import std.io; 

in un file di origine C++ non funziona (compilazione) tuttavia, come la specifica per i moduli (che include sintassi) non è finale.


Le Clang documentation stati che, quando passa la bandiera -fmodules, #includes saranno riscritte per le loro importazioni appropriate. Tuttavia, controllando il preprocessore suggerisce altrimenti (test.cpp contiene solo #include <stdio.h> e una principale vuoto):

$ clang++-3.5 -fmodules -E test.cpp -o test 
$ grep " printf " test 
extern int printf (const char *__restrict __format, ...); 

Inoltre, compilazione di questo file di prova con -fmodules vs alcun flag affatto produce lo stesso file oggetto.

Cosa sto sbagliando?

risposta

11

Come lei ha ricordato, clang Non c'è ancora un C++ sintassi per le importazioni, quindi dubito che #include direttive stanno per essere letteralmente riscritta come le importazioni, quando pre-elaborazione di un file, in modo che non può essere il modo migliore per verifica se i moduli funzionano come previsto.

Tuttavia, se si imposta in modo esplicito -fmodules-cache-path=<path>, è possibile osservare clang popolato con i file precompilati di modulo (*) .pcm durante una generazione - se ci sono i moduli coinvolti.

Avrete bisogno di usare libC++ (che sembra venire con un modulo.modulemap dalla versione 3.7.0) se volete usare una libreria standard abilitata per i moduli in questo momento - sebbene nella mia esperienza questo non funzioni interamente appena ancora. (Il compilatore C++ di Visual Studio 2015 dovrebbe anche ottenere una qualche forma di supporto modulo con Aggiornamento 1 a novembre)

Indipendentemente dallo stdlib, è possibile utilizzare i moduli nel proprio codice. I documenti clang contengono una descrizione dettagliata di Module Map Language, ma Ho anche creato un piccolo progetto di esempio here (utilizzando cmake) che dovrebbe generare una directory cache con alcuni moduli quando viene creata.

14

A partire da this commit, Clang dispone di supporto sperimentale per Modules TS.

Prendiamo gli stessi file di esempio (con una piccola modifica) come nel VS blog post sul supporto del modulo sperimentale.

Innanzitutto, definire il file di interfaccia del modulo. Per impostazione predefinita, Clang riconosce i file con l'estensione cppm (e alcuni altri) come file di interfaccia del modulo 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; 
} 

Si noti che la dichiarazione di interfaccia del modulo deve essere export module M; e non solo module M; come nel post sul blog VS.

quindi consumare il modulo come segue:

// file: bar.cpp 
import M; 

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

Ora, precompilare il modulo foo.cppm con

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

o, se l'estensione interfaccia del modulo è diverso cppm (diciamo ixx, in quanto è con VS), è possibile utilizzare:

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

Poi costruire il programma con

clang++ -fmodules-ts -fprebuilt-module-path=. bar.cpp 

o, se il nome del file PCM non è lo stesso come il nome del modulo, dovreste usare:

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

ho testato questi comandi su Windows che utilizza r303050 build (15 maggio 2017).

Nota: Quando si utilizza l'opzione -fprebuilt-module-path=., ottengo un avvertimento:

clang ++ exe:. Avvertimento: argomento non utilizzato durante la compilazione: '-fprebuilt-module-path =.' [-Wunused-command-line-argument]

che sembra essere errato perché senza tale opzione, il modulo M non viene trovato.

+2

Questo funziona anche con Xcode 9. –