#line e pule para a linha
-
09-06-2019 - |
Pergunta
Algum editor respeita as diretivas C #line em relação aos recursos da linha goto?
Contexto:Estou trabalhando em um gerador de código e preciso pular para uma linha da saída, mas a linha é especificada em relação às diretivas #line que estou adicionando.Posso abandoná-los, mas encontrar a linha de entrada é ainda pior
Solução
Se o editor for programável, deverá ser possível escrever um script para fazer a navegação.Pode até haver um script Vim ou Emacs que já faça algo semelhante.
FWIW, quando escrevo muito Bison/Flexx, escrevi um Zeus Script de macro Lua que tentou fazer algo semelhante (ou seja,mova do arquivo de entrada para a linha correspondente do arquivo de saída procurando o marcador #line).
Para qualquer um que possa estar interessado aqui está esse script de macro específico.
Outras dicas
#line
as diretivas são normalmente inseridas pelo pré-compilador, não no código-fonte, portanto, os editores geralmente não honrarão isso se a extensão do arquivo for .c
.
No entanto, a extensão de arquivo normal para arquivos pós-compilados é .i
ou .gch
, então você pode tentar usar isso e ver o que acontece.
Eu usei o seguinte em um arquivo de cabeçalho ocasionalmente para produzir itens clicáveis em a janela de ouptut do compilador VC6 e VS(2003+) recente.
Basicamente, isso explora o fato de que os itens de saída na saída do compilador estão sendo essencialmente analisados para "PATH(LINENUM):mensagem".
Isso pressupõe o tratamento dado pelo compilador da Microsoft ao "lembrete de pragma".
Não foi exatamente isso que você perguntou...mas pode ser geralmente útil Ao chegar a algo você pode fazer com que o compilador emita que alguns editores podem honrar.
// 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")
Faz um tempo que não experimento, mas ainda deve funcionar.
Use sed ou uma ferramenta semelhante para traduzir #lines para algo não interpretado pelo compilador, para que você receba mensagens de erro C na linha real, mas tenha uma referência ao arquivo de entrada original próximo.