Pergunta

Estou usando alguma macro no meu arquivo de origem (*.c).

Existe alguma maneira durante a compilação ou na biblioteca de identificar o arquivo de cabeçalho exato do qual essa macro específica está sendo resolvida?

O problema é que estamos usando uma macro #definida como 10 em algum arquivo de cabeçalho, mas o valor recebido no código é 4 .Portanto, em vez de verificar todos os arquivos dep, queremos saber se existe alguma maneira direta de identificar a fonte da qual a macro foi resolvida.

Foi útil?

Solução

Se você acabou de executar o CPP (o pré -processador C) no arquivo, a saída conterá as diretrizes #Line do formulário

#line 45 "silly-file-with-macros.h"

Para o compilador dizendo de onde tudo veio. Então, uma maneira é usar

 cpp my-file.c | more

e procure o #line diretivo.

Dependendo do seu compilador, outro truque que você pode usar é redefinir a macro para outra coisa, e o compilador cuspirá um aviso como

test-eof.c:5:1: warning: "FRED" redefined
test-eof.c:3:1: warning: this is the location of the previous definition

(Isto é do GCC), que deve dizer onde a macro foi definida anteriormente. Mas pense bem, como você já não está recebendo esse aviso?

Outra idéia é usar makedepend Para obter uma lista de todos os arquivos incluídos, depois os grepá para #define linhas neles.

Outras dicas

Grep para o #Define?

find / -name '*.h' | xargs -L 100 grep -H macroname

Existem três comandos lá.O comando find seleciona quais arquivos serão pesquisados ​​para que você possa alterá-lo para '.c' ou '.cpp' ou o que você precisar.Em seguida, o comando xargs divide a lista de arquivos em 100 por vez, para que você não exceda o tamanho do buffer de comando interno do shell.Em seguida, o comando grep é executado repetidamente com cada lista de 100 arquivos e imprime quaisquer nomes de arquivos contendo macroname e a linha de código que o utiliza.

A partir disso, você poderá ver onde ele está sendo redefinido.

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