Nos arquivos que estão sendo compilados usando o gcc (vários arquivos .c e .cpp), tenho atualmente algo como:
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic warning "-Wall"
#endif
O objetivo de especificar opções inline em vez de apenas usar a linha de comando é controlar após quais pontos é interessante ser mais rigoroso (por exemplo, após a #include
lista).
Funciona bem. Tentei então adicionar -Wextra
com:
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic warning "-Wall -Wextra"
#endif
Falha. Aparentemente, você não pode usar mais de uma opção em um único pragma
e, em vez disso, deve usar várias linhas:
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic warning "-Wall"
#pragma GCC diagnostic warning "-Wextra"
#endif
- Q1: Existe uma maneira de especificar várias opções em linha?
Em seguida, tentei adicionar -Werror
and -pedantic
, e nem usando diagnostic warning
nem diagnostic error
funciona. Exemplo:
#pragma GCC diagnostic error "-Werror"
falha com: warning: ‘-Werror’ is not an option that controls warnings
. Como posso resolver isso? quais outras alternativas existem além diagnostic [warning|error]
? E quanto a -pedantic
ou -pedantic-errors
? Porque sei que o pedante está mais relacionado à conformidade com os padrões do que ao controle de diagnóstico e não sei se posso especificá-lo in-line.
Bem, você não pode. É assim que é.
Você pode ativar ou desativar avisos específicos ou transformá-los em erros, mas não pode fazer tudo
#pragma
como notou. Observe que"-Wpedantic"
ainda pode ser controlado.Em geral, ainda coloco a maioria das opções no arquivo de construção, incluindo
-Werror
. Não acho que seja uma boa ideia ficar alternando avisos para seções de código.No caso (raro) de algum cabeçalho fornecer avisos, eu uso pragmas para desativá-los para esse cabeçalho -
push
as configurações, desabilitar aviso, incluir cabeçalho,pop
as configurações. Isso leva a construções comoNo entanto, não uso coisas assim em meu próprio código - em vez disso, corrijo os avisos no código ou removo o aviso do sistema de compilação se for muito irritante.
Se por algum motivo você tiver que escrever o pragma em uma única linha, porque está criando uma macro semelhante a uma função ou similar, você pode usar o
_Pragma
operador que é semelhante,#pragma
mas pode ser usado com um pouco mais de flexibilidade. Funciona exatamente da mesma forma, basta comprimir o que você digitaria#pragma
em uma string literal. E se o que você digitou for uma string literal, adicione sequências de escape\"
.Exemplo:
Isso me dá um aviso para a primeira
printf
linhaMas não para o segundo.
Nem todas as opções do compilador podem ser usadas assim, simples assim. Basicamente apenas
-W...
aqueles funcionam. Consulte https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.htmlConforme observado em outra resposta de @Christian Stieber,
-Wpedantic
é uma solução alternativa para ativar essa opção específica.