#line e salta alla riga
-
09-06-2019 - |
Domanda
Qualche editor rispetta le direttive C #line per quanto riguarda le funzionalità goto line?
Contesto:Sto lavorando su un generatore di codice e devo passare a una riga dell'output ma la riga è specificata in relazione alle direttive #line che sto aggiungendo.Posso lasciarli cadere ma trovare la linea di input è ancora più doloroso
Soluzione
Se l'editor è scriptabile, dovrebbe essere possibile scrivere uno script per eseguire la navigazione.Potrebbe anche esserci uno script Vim o Emacs che fa già qualcosa di simile.
FWIW quando scrivo molto di Bison/Flexx ho scritto a Zeus Script macro Lua che ha tentato di fare qualcosa di simile (ad es.spostarsi dal file di input alla riga corrispondente del file di output cercando il contrassegno #line).
Per chiunque possa essere interessato qui è quel particolare script macro.
Altri suggerimenti
#line
le direttive vengono normalmente inserite dal precompilatore, non nel codice sorgente, quindi gli editor di solito non lo rispettano se l'estensione del file è .c
.
Tuttavia, la normale estensione dei file post-compilati è .i
O .gch
, quindi potresti provare a usarlo e vedere cosa succede.
Ho usato occasionalmente quanto segue in un file di intestazione per produrre elementi cliccabili nella finestra del compilatore VC6 e recente vs (2003+).
Fondamentalmente, questo sfrutta il fatto che gli elementi che emettono nell'output del compilatore siano essenzialmente analizzati per "percorso (linenum):Messaggio".
Ciò presuppone il trattamento del "promemoria pragma" da parte del compilatore Microsoft.
Non è proprio quello che hai chiesto...Ma potrebbe essere generalmente utile per arrivare a qualcosa che puoi far emettere il compilatore che alcuni editori potrebbero onorare.
// The following definitions will allow you to insert // clickable items in the output stream of the Microsoft compiler. // The error and warning variants will be reported by the // IDE as actual warnings and errors... which means you can make // them occur in the task list. // In theory, the coding standards could be checked to some extent // in this way and reminders that show up as warnings or even // errors inserted... #define strify0(X) #X #define strify(X) strify0(X) #define remind(S) message(__FILE__ "(" strify( __LINE__ ) ") : " S) // example usage #pragma remind("warning: fake warning") #pragma remind("error: fake error")
È da un po' che non lo provo ma dovrebbe funzionare ancora.
Usa sed o uno strumento simile per tradurre le #linee in qualcos'altro non interpretato dal compilatore, in modo da ottenere messaggi di errore C sulla riga reale, ma avere un riferimento al file di input originale nelle vicinanze.