Comment faire compilateur ne pas montrer int void pointeur de la fonte des avertissements
J'ai un code qui fait beaucoup de la conversion de int en void* et vice-versa (je ne m'inquiète pas si c'est moche. J'aime avoir génériques trucs)
Exemple:
typedef struct _List {
long size;
long mSize; //Max size
void** elementArray;
}List;
List l;
...
int i = 2;
l.elementArray[i] = i; //Intentional usage of pointer as integer
//Actual size of pointer does not matter
mais quand je compile j'obtiens un bajillion
warning: cast to 'void *' from smaller integer type 'int' [-Wint-to-void-pointer-cast]
avertissements.
Est-il un indicateur pour dire à gcc pour ne pas imprimer cet avertissement spécifique?
Je compile avec -Mur, donc je ne sais pas si je peux faire cela, allez de suite que facilement
Utilisation
Aussi, votre exemple ne montre pas de pointeur de jette. L'avertissement que vous obtenez inoffensif, ou il peut être le seul, ahem, d'alerte, vous recevrez avant le programme souffle dans votre visage, sans voir le code en jeu, nous ne pouvons pas le dire.
uintptr_t
à la place.Aussi, votre exemple ne montre pas de pointeur de jette. L'avertissement que vous obtenez inoffensif, ou il peut être le seul, ahem, d'alerte, vous recevrez avant le programme souffle dans votre visage, sans voir le code en jeu, nous ne pouvons pas le dire.
OriginalL'auteur Jean-Luc Nacif Coelho | 2014-03-31
Vous devez vous connecter pour publier un commentaire.
Pour le bien des autres qui sont peut-être à la recherche d'une réponse, comme moi:
Si vous ne voulez pas ajouter un supplément de compilation drapeau en raison du fait que vous pourriez être upcasting une interview à un void* accidentellement quelque part d'autre, vous pouvez utiliser l'extrait de code suivant à la force d'un casting de int void* où vous êtes sûr que vous voulez que cela se produise et ensuite le compilateur ne vais pas vous embêter sur le casting:
Bien sûr, assurez-vous d'inclure stdint.h, alors vous pouvez effectuer les opérations suivantes:
Exactement ce que je voulais, merci.
OriginalL'auteur DanZimm
apparemment il suffit de prendre le drapeau que le compilateur vous donne et claque un "non" en face de lui ne le tour!
J'ai déjà une version de débogage de faire qui n'est pas ignorer les avertissements. Chill.
C'est de l'omi n'est pas une bonne solution, parce que ça ne résout pas le problème, il ne fait que le compilateur l'ignorer. Aussi il tourne l'interrupteur globalement pour l'ensemble du programme, ce qui pourrait causer des problèmes ailleurs dans le code.
Ma question était de savoir comment le compilateur ne pas afficher les drapeaux. Pas comment réparer les drapeaux. Je suis bien conscient de ce que je fais dans le code et j'ai choisi de l'ignorer.
OriginalL'auteur Jean-Luc Nacif Coelho
vous pouvez utiliser 'size_t'.
Par exemple, si vous avez int i et void *a,
i = (void *) a;
va vous donner cet avertissementpour éviter cela, ajoutez size_t
i = (void *) (size_t) a;
OriginalL'auteur Vasu
Dans certains cas, faire ce serait souhaitée (par exemple. pour le dernier paramètre de pointeur de glVertexAttribPointer en OpenGL). Vous devriez être en mesure d'éviter l'avertissement en faisant quelque chose comme ceci:
OriginalL'auteur Quig
L'avertissement est vous dire que ints sont plus étroites que les pointeurs, de sorte que vous sont en train de perdre de l'information quand vous le lancez à partir d'un pointeur vers un int. Comme suggéré ci-dessus, l'utilisation uintptr_t. C'est un type entier, qui est aussi large qu'un pointeur. Si vous êtes contraint d'utiliser l'int, alors vous êtes au SOL. "Générique" == brisé.
Des beaux.
int
s sont encore plus étroit que des pointeurs, de sorte que le compilateur n'a aucun moyen de les bits manquants. Aussi, je présume que le pointeur n'a pas commencé comme uneint
, de sorte qu'ils doivent être un autre endroit quelque part où un pointeur est jeté d'unint
.OriginalL'auteur pat