Então, eu estou trabalhando em uma base de código extremamente grande e atualizei recentemente para o gcc 4.3, que agora aciona este aviso:
aviso: conversão descontinuada da constante de cadeia para 'char *'
Obviamente, a maneira correta de corrigir isso é encontrar todas as declarações como
char *s = "constant string";
ou chamada de função como:
void foo(char *s);
foo("constant string");
e torná-los const char
ponteiros. No entanto, isso significaria tocar no mínimo 564 arquivos, o que não é uma tarefa que desejo executar neste momento. O problema agora é que estou enfrentando -werror
, por isso preciso de alguma maneira de reprimir esses avisos. Como eu posso fazer isso?
Respostas:
Acredito que
-Wno-write-strings
a passagem para o gcc suprimirá esse aviso.fonte
#pragma GCC diagnostic ignored "-Wwrite-strings"
.Quaisquer funções nas quais você passa literais de seqüência de caracteres
"I am a string literal"
devem ser usadaschar const *
como o tipo em vez dechar*
.Se você estiver consertando algo, conserte certo.
Explicação:
Você não pode usar literais de cadeia para inicializar cadeias que serão modificadas, porque são do tipo
const char*
. Erradicação dos constness para modificá-los mais tarde é um comportamento indefinido , então você tem que copiar suasconst char*
cordaschar
porchar
em alocação dinâmicachar*
cordas, a fim de modificá-los.Exemplo:
fonte
char *
/const char *
, portanto, nesse caso, eu normalmente transmito.char*
mesmo para strings que não serão modificados. Se você pegar um parâmetro como achar const*
e passá-lo para uma função padrão, pegue umchar*
. Se a função da biblioteca não estiver manipulando a string, você poderá eliminar oconst
.Eu tive um problema semelhante, resolvi-o assim:
Esta é uma maneira apropriada de resolver isso? Não tenho acesso para
foo
adaptá-lo para aceitarconst char*
, embora isso seria uma solução melhor (porquefoo
não mudam
).fonte
char **
inPyArg_ParseTupleAndKeywords
eu faço algo parecido com isto:static char kw[][16] = {"mode", "name", "ip", "port"}; static char * kwlist[] = {kw[0], kw[1], kw[2], kw[3], NULL};
Confira o suporte ao Diagnostic Pragma do gcc e a lista de opções de aviso -W (alterada: novo link para opções de aviso ).
Para o gcc, você pode usar
#pragma warning
diretivas como explicadas aqui .fonte
Se for uma base de código ativa, você ainda poderá atualizar a base de código. Obviamente, executar as alterações manualmente não é viável, mas acredito que esse problema possa ser resolvido de uma vez por todas por um único
sed
comando. Eu não tentei, no entanto, então faça o seguinte com um grão de sal.Isso pode não encontrar todos os locais (mesmo sem considerar as chamadas de função), mas aliviaria o problema e tornaria possível executar as poucas alterações restantes manualmente.
fonte
Não consigo usar a opção de compilador. Então eu virei isso:
para isso:
fonte
Aqui está como fazer isso em linha em um arquivo, para que você não precise modificar o Makefile.
Você pode depois ...
fonte
Substituir
com
ou se você estiver chamando na função:
substitua isso por
fonte
Ao invés de:
Isso funciona:
fonte
Em C ++, use o
const_cast
como abaixofonte
Test string
é const string. Então você pode resolver assim:ou:
fonte
Por que não usar apenas conversão de tipo?
fonte
Faça a conversão de tipos de letra constante para ponteiro char, ou seja,
fonte
Em C ++, substitua:
com:
E se você quiser compará-lo:
fonte
Trabalhando com o Arduino Sketch, eu tinha uma função causando meus avisos.
Para interromper os avisos, adicionei o const na frente do char * str e do char * sfind.
Todos os avisos foram embora.
fonte
veja esta situação:
observe o campo name, no gcc ele compila sem aviso, mas no g ++ ele vai, não sei por quê.
fonte
Você também pode criar uma sequência de caracteres gravável a partir de uma constante de sequência chamando
strdup()
.Por exemplo, este código gera um aviso:
No entanto, o código a seguir não faz (ele faz uma cópia da sequência na pilha antes de passá-la para
putenv
):Nesse caso (e talvez na maioria dos outros), desligar o aviso é uma má idéia - existe por um motivo. A outra alternativa (tornar todas as seqüências de caracteres graváveis por padrão) é potencialmente ineficiente.
Ouça o que o compilador está dizendo!
fonte
putenv()
é cheio - não é uma boa escolha de exemplo (pelo menos, não sem muito mais discussão sobre o queputenv()
faz do que existe nesta resposta). É toda uma discussão separada. (Observe que a especificação POSIX para o comportamento deputenv()
é problemática, com base nas implementações herdadas anteriores à definição do POSIX.) IIRC, houve um bug em uma versão recente (neste milênio) da GNU C Library que estava relacionada àputenv()
mudança de comportamento, e sendo alterado novamente).basta usar a opção -w para g ++
exemplo:
g ++ -w -o simple.o simple.cpp -lpthread
Lembre-se de que isso não evita a descontinuação, mas evita a exibição de uma mensagem de aviso no terminal.
Agora, se você realmente deseja evitar a descontinuação, use a palavra-chave const como esta:
fonte
Por que você não usa a
-Wno-deprecated
opção para ignorar mensagens de aviso obsoletas?fonte
Este é seu verdadeiro problema, IMO. Você pode tentar algumas maneiras automatizadas de passar de (char *) para (const char *), mas eu colocaria dinheiro nelas não apenas trabalhando. Você terá que ter um humano envolvido por pelo menos parte do trabalho. No curto prazo, ignore o aviso (mas o IMO o deixe ativado ou ele nunca será corrigido) e remova o erro -Werror.
fonte
Obrigado a todos pela ajuda. Escolhendo daqui e de lá vem esta solução. Isso compila limpo. Ainda não testei o código. Talvez amanhã...
Eu sei, há apenas 1 item na matriz timeServer. Mas poderia haver mais. O restante foi comentado por enquanto para economizar memória.
fonte
observe o campo name, no gcc ele compila sem aviso, mas no g ++ ele vai, não sei por quê.
em
gcc (Compiling C)
, -Wno-write-strings está ativo por padrão.em
g++ (Compiling C++)
-Wwrite-strings está ativo por padrãoÉ por isso que existe um comportamento diferente. Para nós, usar macros de
Boost_python
gera esses avisos. Então, usamos-Wno-write-strings
ao compilar C ++, pois sempre usamos-Werror
fonte
Declare a string como a
const
resolverá o problema:fonte