Comment éliminer les “jeter les qualifier” d'avertissement?
À l'aide de GCC et C99 mode, j'ai une fonction déclarée en tant que:
void func(float *X);
Lorsque j'appelle la fonction, j'utilise un volatile tableau Y:
volatile float Y[2];
int main()
{
func(Y);
return 0;
}
Lors de la compilation (avec -Wall
), j'obtiens le message d'avertissement suivant:
warning: passing argument 1 of ‘func’ discards qualifiers from pointer target type
blah.c:4: note: expected ‘float *’ but argument is of type ‘volatile float *’
Je peux l'éliminer avec un explicite (float *)
type de fonte, mais cela se répète dans de nombreux endroits dans le code.
Est-il un moyen d'éliminer cette avertissement spécifique, avec une option ou d'un pragma (ou quelque chose d'équivalent)?
Qu'est-ce que avez à faire avec printf?
vous avez raison, la fonction printf, je viens de faire de la question plus générale.
vous avez raison, la fonction printf, je viens de faire de la question plus générale.
OriginalL'auteur ysap | 2012-08-28
Vous devez vous connecter pour publier un commentaire.
Non, vous ne pouvez pas transformer cet avertissement off. Il vous dit que vous êtes violation du type de système. Si vous voulez l'appeler
func
, vous avez besoin pour passer des pointeurs de données non volatile ou de modifier la signature de la fonction d'accepter des pointeurs vers les données volatiles.volatile
qualificatif est un signal pour que l'optimiseur. Donc, je me demande pourquoi il est considéré comme une violation du système de type?!De la même manière que le passage d'un
const int*
à une fonctionfunc(int*)
est une violation du système de type.tout comme
const
, fait partie de ce type.Jonathan - Tout en acceptant vos commentaires, je vois une différence entre les
const
et lavolatile
qualificatifs. La façon dont je le comprends,const
qualificatif donne compilation (par opposition à pour optimiser le temps) des informations sur l'objet. Par exemple, il devrait m'empêcher de l'affectation d'une valeur à cet objet, et je devrais obtenir un diagnostic si j'essaie de le faire. Avec les volatiles, il n'y a pas ce problème (que j'imagine pour le moment).... mais, quand vous venez pour penser à elle, au point peut-être que le compilateur des gardes de cas où un volatile objet est passé à un non-volatile de la fonction, et la fonction, de non-volatile arguments, est sur-optimisé pour le point d'où le résultat, par la volatilité de l'objet est incorrect!
OriginalL'auteur Jonathan Wakely
La Norme permet de compilateurs à faire ce qu'ils veulent si un non-qualifiés pointeur est utilisé pour accéder à un
volatile
-objet qualifié. Cela permet de plates-formes où certainsvolatile
qualifiés objets peuvent exiger des instructions spéciales pour y accéder, où par exemple une écriture viavolatile uint16_t*
peut faire générer le code équivalent à:Si un compilateur écrivain prend l'attitude que les compilateurs ne doit exploiter ces libertés sur l'obscur, de plateformes de faire autrement serait coûteux, et devrait fournir sensible des comportements sur les plates-formes là où il en coûterait presque rien, et si le code d'appel dans l'exemple original sait qu'aucune des entités à l'extérieur aura accès
Y
lors de l'exécution defunc
, puis ciblage par code que le compilateur va être en mesure d'atteindre ce comportement sans un diagnostic par simple coulée de Y adresse à unfloat*
. Malheureusement, le peuple maintien de la gcc et clang semblent croire que, lorsque la Norme se réfère à la "non-portables ou erronée des constructions", cela signifie vraiment "non-portable, c'est à dire erronées, des constructions" plutôt que "des constructions qui ne sont pas portables à chaque conforme de la machine dans l'Univers, et serait erroné si cette transférabilité étaient destinés. Casting le pointeur defloat*
silence l'avertissement sur gcc ou clang, mais je ne voudrais pas compter sur elle, provoquant ainsi leur rendement raisonnable code.OriginalL'auteur supercat