waarschuwing: ISO C++ verbiedt het converteren van een stringconstante naar ‘char*’ [-Wwrite-strings] [duplicate]

zeer eenvoudige code waarschuwt me. Sommige hints zijn niet constructief. Waarschuwing is:

ISO C++ verbiedt het converteren van een stringconstante naar ‘char*’ [-Wwrite-strings]

Ik heb geprobeerd:

char const *q = "pin";
char const *r = "\n\r";
{
while(client.findUntil(*q, *r)) 

zonder succes

Origincode:

while(client.findUntil("pin", "\n\r"))

Antwoord 1, autoriteit 100%

ISO C++ verbiedt het converteren van een stringconstante naar ‘char*’ [-Wwrite-strings]

while(client.findUntil("pin", "\n\r"))

De waarschuwing betekent dat uw programma slecht is gevormd. Je hebt de declaratie niet getoond, maar uit de context kunnen we afleiden dat het argument van findUntilchar*is. Je mag geen letterlijke tekenreeks doorgeven aan een dergelijke functie.

Vroeger was het goed gevormd – maar verouderd – om een letterlijke tekenreeks door te geven als char*vóór C++11.

Ik heb het geprobeerd:

char const *q = "pin";
char const *r = "\n\r";

Deze zijn op zich correct, maar

while(client.findUntil(*q, *r)) 

Dit slaat nergens op. Voorheen probeerde je een string door te geven, maar nu indirect via de karakteraanwijzer zodat je een karakter doorgeeft. Tenzij de functie een sjabloon is, kan dit onmogelijk werken.

findUntil(q, r)zal ook niet werken, omdat de pointers naar const niet impliciet worden geconverteerd naar pointers naar non-const.

Een juiste oplossing is om de letterlijke tekenreeksen naar aanpasbare arrays te kopiëren:

char q[] = "pin";
char r[] = "\n\r";
{
    while(client.findUntil(q, r)) 

Een andere is om findUntilte repareren om in plaats daarvan een aanwijzer naar const char te accepteren. Dan kun je letterlijke tekenreeksen gebruiken, omdat ze kunnen worden geconverteerd naar een pointer naar const char.

Other episodes