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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top