La conversion de ‘void *’ en pointeur en non-‘evoid’ nécessite une conversion explicite (Ligne 17)

Je suis le livre Apprendre C à la dure et quand j’essaye de lancer ce programme, le message d’erreur suivant s’affiche:

La conversion de ‘void *’ en pointeur en non-‘evoid’ nécessite une conversion explicite.

Je ne sais pas comment résoudre ce problème, dois-je changer la variable de retour dans la structure?

Regardez quand même, voici le code: (compilation sur Visual C ++ 2010, GCC n’a pas encore été essayé).

//learn c the hardway #include  #include  #include  #include  struct Person { char *name; int age; int height; int weight; }; struct Person *Person_create(char *name, int age, int height, int weight) { struct Person *who = malloc(sizeof(struct Person)); assert(who != NULL); who->name = strdup(name); who->age = age; who->height = height; who->weight = weight; return who; } void Person_destroy(struct Person *who) { assert(who != NULL); free(who->name); free(who); } void Person_print(struct Person *who) { printf("Name: %s\n", who->name); printf("\tAge: %d\n", who->age); printf("\tHeight: %d\n", who->height); printf("\tWeight: %d\n", who->weight); } int main(int argc, char *argv[]) { // make two people structures struct Person *joe = Person_create( "Joe Alex", 32, 64, 140); struct Person *frank = Person_create( "Frank Blank", 20, 72, 180); // print them out and where they are in memory printf("Joe is at memory location %p:\n", joe); Person_print(joe); printf("Frank is at memory location %p:\n", frank); Person_print(frank); // make everyone age 20 years and print them again joe->age += 20; joe->height -= 2; joe->weight += 40; Person_print(joe); frank->age += 20; frank->weight += 20; Person_print(frank); // destroy them both so we clean up Person_destroy(joe); Person_destroy(frank); return 0; } 

Cette ligne nécessite un casting:

  struct Person *who = malloc(sizeof(struct Person)); 

Devrait être:

  struct Person *who = (struct Person *)malloc(sizeof(struct Person)); 

Ceci est uniquement dû au fait que vous comstackz ce code en tant que C ++, et non pas en tant que C. En C, la conversion est inutile et implicitement effectuée pour vous.

Le compilateur Visual C ++ tentera de déterminer le langage en cours de compilation à partir de l’extension de fichier du fichier source en cours de compilation. Par exemple, un fichier avec une extension .cpp est compilé en tant que C ++ et un fichier avec une extension .c est compilé en tant que C.

Votre programme semble être valide en C, mais pas en C ++: en C, la conversion void* to T* est implicite; en C ++, un cast est requirejs.

Si vous voulez que le compilateur le comstack en C, vous devez soit modifier son extension de fichier, soit passer le commutateur /TC au compilateur pour lui dire de comstackr le fichier en tant que C.

 struct Person *who = malloc(sizeof(struct Person)); 

Cela doit être converti en C ++:

 struct Person *who = (struct Person *) malloc(sizeof(struct Person)); 

En C, la conversion n’est pas nécessaire car il existe une conversion implicite de void * vers n’importe quel type de pointeur d’object. Cette conversion implicite n’étant pas présente en C ++, la conversion est requirejse en C ++.

Le message d’erreur est dû au fait que C ne nécessite pas explicitement une telle conversion, contrairement à C ++. Essayez de vous assurer que le compilateur traite la source en C plutôt qu’en C ++.