Existe uma maneira de o gcc / g ++ despejar suas definições de pré-processador na linha de comando? I coisas más, como __GNUC__
, __STDC__
e assim por diante.
gcc
g++
c-preprocessor
Anycorn
fonte
fonte
echo | gcc -dM -E -
funciona também no Windows.cpp -dM -E - < NUL
pode ser usado.Eu costumo fazer assim:
Observe que algumas definições do pré-processador dependem das opções da linha de comando - você pode testá-las adicionando as opções relevantes à linha de comando acima. Por exemplo, para ver quais opções SSE3 / SSE4 estão ativadas por padrão:
e compare isso quando
-msse4
for especificado:Da mesma forma, é possível ver quais opções diferem entre dois conjuntos diferentes de opções de linha de comando, por exemplo, comparar as definições do pré-processador para os níveis de otimização
-O0
(nenhum) e-O3
(completo):fonte
Resposta tardia - achei as outras respostas úteis - e queria adicionar um pouco mais.
Como despejo macros de pré-processador provenientes de um arquivo de cabeçalho específico?
ou (obrigado a @mymedia pela sugestão):
Em particular, eu queria ver o que SOMAXCONN foi definido no meu sistema. Eu sei que poderia abrir o arquivo de cabeçalho padrão, mas às vezes tenho que procurar um pouco para encontrar os locais dos arquivos de cabeçalho. Em vez disso, posso apenas usar esta linha:
fonte
A abordagem simples (
gcc -dM -E - < /dev/null
) funciona bem para o gcc, mas falha no g ++. Recentemente, eu exigi um teste para um recurso C ++ 11 / C ++ 14. As recomendações para seus nomes de macro correspondentes estão publicadas em https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations . Mas:sempre falha, porque chama silenciosamente os drivers C (como se invocados por
gcc
). Você pode ver isso comparando sua saída com a do gcc ou adicionando uma opção de linha de comando específica para g ++ como (-std = c ++ 11) que emite a mensagem de errocc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C
.Como o gcc (que não é C ++) nunca suporta "Aliases de modelos" (consulte http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf ), você deve adicionar a
-x c++
opção a forçar a invocação do compilador C ++ (créditos para usar as-x c++
opções em vez de um arquivo fictício vazio, vá para yuyichao, veja abaixo):Não haverá saída porque o g ++ (revisão 4.9.1, o padrão é -std = gnu ++ 98) não habilita os recursos do C ++ 11 por padrão. Para fazer isso, use
que finalmente rende
observando que o g ++ 4.9.1 suporta "Aliases de modelos" quando chamado com
-std=c++11
.fonte
-x
argumento, portantog++ -x c++ -dM -E -std=c++11 - < /dev/null | grep cpp
deve funcionar.Uma abordagem portátil que funciona igualmente bem no Linux ou Windows (onde não há / dev / null):
Para c ++, você pode usar (substitua
c++11
pela versão que usar):Ele funciona dizendo ao gcc para pré-processar o stdin (produzido pelo echo) e imprimir todas as definições do pré-processador (procurar
-dletters
). Se você deseja saber o que define são adicionados quando você inclui um arquivo de cabeçalho, pode usar a-dD
opção semelhante a -dM, mas não inclui macros predefinidas:Observe, no entanto, que a entrada vazia ainda produz muitas definições com a
-dD
opçãofonte
NUL
, estará de volta à estaca zero: ele não funcionará em sistemas que não o possuem.sort
se comporte um pouco diferente):echo | gcc -x c++ -std=c++17 -dM -E - | sort
Enquanto trabalhamos em um grande projeto que possui um sistema de compilação complexo e onde é difícil obter (ou modificar) o comando gcc / g ++ diretamente, há outra maneira de ver o resultado da expansão de macro. Redefina simplesmente a macro e você obterá uma saída semelhante à seguinte:
fonte