identificar o arquivo de cabeçalho exato
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.
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.