71 votes

déréférencement d'un pointeur vers un type incomplet

J'ai vu beaucoup de questions sur ce sujet mais je vais poser la question différemment sans code spécifique. Existe-t-il un moyen de EASILY déterminer ce qui fait que le type est incomplet ? Dans mon cas, j'utilise le code de quelqu'un d'autre et je suis tout à fait sûr que je n'ai pas les bons en-têtes, mais (puisque les ordinateurs font ce genre de choses beaucoup plus vite et mieux que les yeux humains) y a-t-il un moyen de faire en sorte que le compilateur dise, "hey vous piense en vous avez le type X à la ligne 34 mais c'est en fait manquant ." L'erreur elle-même n'apparaît qu'au moment de l'affectation, ce qui n'est pas très utile.

56voto

Potatoswatter Points 70305

L'autre jour, j'ai vu une question où quelqu'un avait utilisé par inadvertance un type incomplet en spécifiant quelque chose comme

struct a {
    int q; 
}; 
struct A *x; 
x->q = 3;

Le compilateur savait que struct A était une structure, malgré A étant totalement indéfini, en vertu de la struct mot-clé.

C'était en C++, où une telle utilisation de struct est atypique (et, il s'avère, qu'elle peut conduire à un tir au pied). En C, si vous faites

typedef struct a {
    ...
} a;

alors vous pouvez utiliser a comme nom de type et omettre le struct plus tard. Cela conduira le compilateur à vous donner une erreur d'identifiant non défini plus tard, plutôt qu'un type incomplet, si vous vous trompez dans le nom ou si vous oubliez un en-tête.

19voto

Steeven Li Points 171

Une autre raison possible est la référence indirecte. Si un code fait référence à une structure qui n'est pas incluse dans le fichier c actuel, le compilateur se plaindra.

a->b->c //erreur si b n'est pas inclus dans le fichier c actuel

12voto

Steve Jessop Points 166970

Que voulez-vous dire, l'erreur n'apparaît que lorsque vous assignez ? Par exemple sur GCC, sans aucune assignation en vue :

int main() {
    struct blah *b = 0;
    *b; // this is line 6
}

incompletetype.c:6: error: dereferencing pointer to incomplete type .

L'erreur es à la ligne 6, c'est là que j'ai utilisé un type incomplet comme si c'était un type complet. J'étais bien jusque là.

L'erreur est que vous auriez dû inclure l'en-tête définissant le type. Mais le compilateur ne peut pas deviner à quelle ligne il aurait fallu l'inclure : n'importe quelle ligne en dehors d'une fonction conviendrait, à peu près. Il ne va pas non plus parcourir tous les fichiers texte de votre système, à la recherche d'un en-tête qui le définit, et vous suggérer de l'inclure.

Alternativement (bonne remarque, potatoswatter), l'erreur se situe à la ligne où b a été défini, lorsque vous signifiait pour spécifier un type qui existe réellement, mais qui est réellement spécifié blah . Trouver la définition de la variable b ne devrait pas être trop difficile dans la plupart des cas. Les IDE peuvent généralement le faire pour vous, les avertissements du compilateur ne sont peut-être pas nécessaires. C'est un code assez odieux, cependant, si vous ne pouvez pas trouver les définitions des choses que vous utilisez.

8voto

AndreyT Points 139512

Je ne comprends pas exactement quel est le problème. Le type incomplet n'est pas le type qui est "manquant". Le type incomplet est un type qui est déclaré mais pas défini (dans le cas des types struct). Trouver la déclaration non-définitive est facile. Quant à trouver la définition manquante... le compilateur ne vous aidera pas ici, puisque c'est ce qui a causé l'erreur en premier lieu.

Une raison majeure des erreurs de type incomplètes en C sont les fautes de frappe dans les noms de type, qui empêchent le compilateur de faire correspondre un nom à l'autre (comme dans la correspondance entre la déclaration et la définition). Mais là encore, le compilateur ne peut pas vous aider. Le compilateur ne fait pas de suppositions sur les typos.

1voto

catzilla_waw Points 1

Cette erreur apparaît habituellement si le nom de votre structure est différent de l'initialisation de votre structure dans le code, donc normalement, c trouvera le nom de la structure que vous mettez et si la structure originale n'est pas trouvée, ceci apparaîtra habituellement, ou si vous pointez un pointeur dans ce pointeur, l'erreur apparaîtra.

0 votes

Accepter. Vérifiez d'abord les typos dans les définitions de structures par rapport aux déclarations, et dans tous les typedefs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X