2014-06-29 19 views
18

Sto lavorando a un progetto C++ in cui sto usando molto #pragma omp. Uso il meraviglioso formato clang per la pulizia ma elimina sempre il rientro per tutte le direttive del preprocessore. C'è un modo per cambiare questo comportamento? O c'è un altro strumento di formattazione che è più raccomandabile? O dovrei evitare di usare questi strumenti?Rientro delle direttive del preprocessore con clang-format

+2

Storicamente, le direttive del preprocessore * dovuto * per iniziare alla prima colonna, ed è ancora consuetudine per molti a porre almeno il principale indicatore di direzione '#' nella prima colonna della linea. –

+2

Capisco ... ma vedi il mio punto, vero? Poiché "#pragma omp" è applicato ai blocchi (che sono rientrati) è molto più piacevole vedere specialmente queste direttive rientrate ... – dawirstejeck

+1

Ho lo stesso problema. Tutto quello che riuscivo a trovare era un [bug report] aperto (https://llvm.org/bugs/show_bug.cgi?id=17362). Spero che lo implementeranno presto. – mnme

risposta

5

Si consiglia di eseguire una patch solo da soli e di effettuare una richiesta di pull.

Non è poi così difficile, ho fatto una richiesta di prelievo altrettanto banale una volta. Il codice in formato clang è abbastanza ordinato. Clang-format gestisce già i commenti di codice nel modo desiderato, allineandoli al codice circostante (almeno ha un'opzione per abilitarlo), quindi fare una patch per trattare certe direttive PP allo stesso modo dovrebbe essere semplice.

In alternativa, puoi semplicemente scrivere la patch da te e compilare clang yourself dalla sorgente con l'opzione extra, da utilizzare nel tuo progetto. L'ho fatto anche io prima di decidere di inviare loro la patch.

Mi ci sono volute solo poche ore per capire come fare questo, il loro codice è molto più pulito rispetto al codice di molti altri progetti open source del.

+0

Lo esaminerò e se non è davvero così difficile lo farò. Ma adesso sto affogando nel lavoro, quindi forse in 2 o 3 mesi ... – dawirstejeck

+0

hai fatto dei progressi su questo? :-) caratteristica molto apprezzata! – Gabriel

2

È tardi, ma questa è la soluzione che stai cercando. Formatta il pragma insieme al blocco di codice. È possibile utilizzarlo prima che sostengano definitivamente il rientro del pragma.

https://github.com/MedicineYeh/p-clang-format

Il concetto principale sostituisce la stringa in modo che il formattatore utilizza le regole "corretta" a questi pragma. L'esempio motivativo è il seguente.

# Replace "#pragma omp" by "//#pragma omp" 
sed -i 's/#pragma omp/\/\/#pragma omp/g' ./main.c 
# Do format 
clang-format ./main.c 
# Replace "// *#pragma omp" by "#pragma omp" 
sed -i 's/\/\/ *#pragma omp/#pragma omp/g' ./main.c 
+0

Buona risposta, purché il codice non contenga #pragmas già commentati che vengono riattivati ​​da questo. Se il tuo codice li ha, '#pragma omp' può essere sostituito da qualcosa come' // AWRBHAWRBWAQ' invece. Praticamente qualsiasi commento farà finché non è già presente nel codice sorgente. – hvd

0

A partire dalla versione 6.0, l'opzione IndentPPDirectives può essere utilizzato. L'utilizzo è descritto in this review.

Utilizzando IndentPPDirectives: None risultati in:

#if FOO 
#if BAR 
#include <foo> 
#endif 
#endif 

Mentre IndentPPDirectives: None dà:

#if FOO 
# if BAR 
# include <foo> 
# endif 
#endif