avertissement: ignore 'const' qualificatifs de pointeur de type de cible
N'est pas const char *s
signifie que "s est un pointeur qui pointe vers une constante char ", alors pourquoi il me donne cet avertissement? Je n'essaie pas de changer les valeurs.
Dans la première fonction d'avertissement est return discards 'const' qualifiers from pointer target type
.
et dans le deuxième avertissement est assignment discards 'const' qualifiers from pointer target type
.
J'essayais de faire de la bibliothèque de fonctions qui sont définies dans string.h
, et aussi me dire comment le corriger.
char *my_strchr( const char *s, int c )
{
for(;*s!='char *my_strchr( const char *s, int c )
{
for(;*s!='\0';s++)
if(*s==c)
return s; //warning
return 0;
}
char *my_strpbrk( const char *s1, const char *s2 )
{
char *s2ptr;
for(;*s1!='\0';s1++)
for(s2ptr=s2;*s2ptr!='\0';s2ptr++) //warning
if(*s1==*s2ptr)
return s2ptr;
return 0;
}
';s++)
if(*s==c)
return s; //warning
return 0;
}
char *my_strpbrk( const char *s1, const char *s2 )
{
char *s2ptr;
for(;*s1!='char *my_strchr( const char *s, int c )
{
for(;*s!='\0';s++)
if(*s==c)
return s; //warning
return 0;
}
char *my_strpbrk( const char *s1, const char *s2 )
{
char *s2ptr;
for(;*s1!='\0';s1++)
for(s2ptr=s2;*s2ptr!='\0';s2ptr++) //warning
if(*s1==*s2ptr)
return s2ptr;
return 0;
}
';s1++)
for(s2ptr=s2;*s2ptr!='char *my_strchr( const char *s, int c )
{
for(;*s!='\0';s++)
if(*s==c)
return s; //warning
return 0;
}
char *my_strpbrk( const char *s1, const char *s2 )
{
char *s2ptr;
for(;*s1!='\0';s1++)
for(s2ptr=s2;*s2ptr!='\0';s2ptr++) //warning
if(*s1==*s2ptr)
return s2ptr;
return 0;
}
';s2ptr++) //warning
if(*s1==*s2ptr)
return s2ptr;
return 0;
}
Votre
Note: la valeur de Retour de
"const char *s signifie que "s est un pointeur qui pointe vers une constante char" --> Pas de.
aucune des réponses ci-dessous a résolu votre problème, il ne marque tout comme acceptée. Lire plus à ce sujet ici: stackoverflow.com/help/accepted-answer
return
déclaration est la conversion de const char *
à char *
, c'est à dire, il est implicitement en changeant le type en jetant l' const
restriction. Vous pouvez résoudre le problème en changeant le type de retour de fonction à const char *
(ou char const *
), ou la suppression de const
à partir de l'argument type, ou vous pouvez contourner le type de système en insérant un cast explicite, c'est à dire return (char *)s;
Note: la valeur de Retour de
strpbrk
doit être un pointeur de chaîne s1
, pas s2
."const char *s signifie que "s est un pointeur qui pointe vers une constante char" --> Pas de.
s
points de char
qui ne doit pas être modifié. Les données s
points pour peut ou peut ne pas être constante, mais cette fonction ne doit pas tenter de le changer. Look. mais ne touchez pas.aucune des réponses ci-dessous a résolu votre problème, il ne marque tout comme acceptée. Lire plus à ce sujet ici: stackoverflow.com/help/accepted-answer
OriginalL'auteur Ummair | 2016-05-11
Vous devez vous connecter pour publier un commentaire.
En effet, il n'. Vous obtenez l'avertissement parce que vous tentez de convertir cela en un pointeur qui pointe vers une (non constante) char. Il y a une règle dans C à dire qu'elle est toujours ok pour convertir à partir du pointeur de type pointeur-à-const-type, mais pas dans l'autre sens.
Il n'a pas d'importance si votre code tente de modifier les valeurs ou non. Simplement en utilisant
char*
vous dire au compilateur que vous voulez un pointeur qui est autorisé à modifier les valeurs.La plupart de la bibliothèque C standard les fonctions ne font pas toujours sens quand il s'agit de "const correctness". Il y a par exemple aucun moyen de mettre en œuvre proprement
strchr
. Vous devrez retourner(char*)s
et jeté leconst
, ce qui est très mauvais en programmation. C'est la faute de la personne qui a précisé lastrchr
fonction: il est imparfait par nature.Oui, quelques-uns d'entre eux sont gravement mauvais (et contradictoires), comme
gets()
.Il ne dispose que de prendre de 22 ans pour se débarrasser de
gets()
(C89-C11).Vous êtes à l'aide de la constante en place de const, ceux sont des concepts différents.
Mais les débutants ne sont pas, de sorte qu'ils seront confus quand ils apprendront plus tard const != constant, qui vous a enseigné que c'est la même chose.
OriginalL'auteur Lundin
C n'a pas de conversion implicite de
const-qualified
types de pointeur non-const-qualifiés, afin de surmonter l'avertissement que vous devez ajouter explicitement.Remplacer
return s;
avecreturn (char *)s;
char *
et 's2' est de typeconst char *
const char*
de la valeur à unchar *
pointeur.Et sur la façon de réparer cet avertissement... Cela dépend de ce que vous essayez de faire. Vous pouvez soit faire
char *s2ptr
commeconst char * s2ptr
ou supprimer leconst
des2
.Donc si vous souhaitez convertir
char *s2ptr
àconst char *s2ptr
, ne pas oublier de convertir explicitements2ptr
à(char *)s2ptr
, tandis que le retour dans le my_strpbrk() fonction.parce que ce serait de permettre des code pour modifier l'a souligné, une chaîne qui nouveaux mettent en doute l'intention de
const
.OriginalL'auteur Liju Thomas
Pour le premier cas, votre type de retour est un
char
Vous essayez de passer unconst char
que le retour.Pour le deuxième cas, le problème est dans
s2ptr=s2
.s2ptr
est unchar
ets2
est unconst char
.char *
je pense qu'il renvoie une adresse qui pointe vers un personnage. En deuxièmes2ptr
ets2
sont deux pointeurs, je suis juste en donnant l'adresse qui est danss2
às2ptr
, n'est-ce pas ce qui a permis? Si non, comment les corriger.OriginalL'auteur Rishikesh Raje