incompatible déclaration implicite de la fonction "printf"
J'ai un gros problème.
C'est l'en-tête de fichier que j'ai créé pour avoir un peu de menu terminal.
Le problème est dans la fonction "menu" (nom italien) , que quand je compile, je reçois un avertissement qui dit que
"[Avertissement] incompatible déclaration implicite de la fonction intégrée 'printf' [activé par défaut]"
Et puis, si je le lance il plante.
#ifndef HEADER
#define HEADER
int numeroOpz = 0;
int selezON = 0;
int tasto;
struct Opzione{
char *testo;
int selez;
};
struct Opzione *opz;
void nuovaOpzione(char *testoOpz){
strcpy(opz[numeroOpz].testo, testoOpz); //Il testo dell'opzione viene copiato
opz[numeroOpz].selez = 0; //Nessuna opzione viene inizialmente selezionata
numeroOpz++;
}
void menu(){
opz[0].selez = 1;
while(tasto != 13){
int i;
for(i=0;i < numeroOpz;i++){
if(opz[i].selez == 1){
printf("||%s||\n", opz[i].testo);
}
else if(opz[i].selez == 0){
printf("%s\n", opz[i].testo);
}
tasto = getch();
switch (tasto){
case 72: //SU
if(selezON > 0){
opz[selezON].selez = 0;
opz[selezON-1].selez = 1;
selezON--;
}
else{
opz[selezON].selez = 0;
opz[numeroOpz-1].selez = 1;
}
break;
case 80: //GIU
if(selezON < numeroOpz){
opz[selezON].selez = 0;
opz[selezON+1].selez = 1;
selezON++;
}
else{
opz[selezON].selez = 0;
opz[0].selez = 1;
}
break;
default:
printf("Error\n\n\n\n");
break;
}
}
}
}
#endif
Et VOICI le fichier source:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Opzioni.h"
int main(){
nuovaOpzione("Ciao");
nuovaOpzione("Bellaaa");
nuovaOpzione("Hey");
menu();
getch();
return 0;
}
Je suis juste fou, et oui, j'ai beaucoup cherché de l'aide dans d'autres questions...
Merci pour votre aide si vous en avez! 😛
btw: la fonction strcpy dans "nuovaOpzione" est un avertissement, mais yolo...
- Ne pas mettre de corps de la fonction dans vos fichiers d'en-tête.
- Avez-vous une définition de fonction dans votre fichier d'en-tête? Si oui, il doit être déplacé vers le fichier source.
- Qu'est-ce que votre compilateur/linker commande ressembler?
- Bien que
#include <stdio.h>
n'est pas dans"Opzioni.h"
,#include <stdio.h>
est inclus dans le principal.c avant de faire#include "Opzioni.h"
, de sorte que cet avertissement est inattendu. Je pense que ce qui est affiché diffère de l'OP de la compilation ou de l'autre .c fichier comprend "Opzioni.h" sans précédent#include <stdio.h>
. - Aussi suspecte d'avertissement avec des mots "built-in" pour décrire
printf()
. - Compiler le code indiqué dans la question n'est pas de produire le message d'erreur signalé. (Un message sur
getch
est produite.) Il est probable que le code indiqué dans la question est de pas le code que vous avez utilisé le compilateur lorsque le message surprintf
a été produit. Pour déclarergetch
, vous devriez probablement#include <curses.h>
avant d'utilisergetch
. Si vous recevez toujours un message surprintf
, vous devez vérifier attentivement que les fichiers de compilation sont exactement celles qui sont affichées dans cette question. strcpy function in "nuovaOpzione" is a warning as well
est une preuve supplémentaire que les codes affichée diffère de l'OP de la compilation pour des raisons similaires surprintf()
avertissement . Le code principal comprend <string.h> un la waring est inattendu. OP, merci de poster votre code réel.
Vous devez vous connecter pour publier un commentaire.
Jens est à droite sur le printf avertissement.
Pour la panne, en fonction de votre programme, vous avez besoin d'un tableau pour
opz
, pas un pointeur.strcpy(opz[numeroOpz].testo, testoOpz)
.Vous avez oublié de l'inclure:
printf
. Probablement, il est en train d'essayer de compiler le.h
fichier seul, comme indépendante de l'unité de compilation. Pour faire que erreur de s'en aller, il doit inclure stdio.h dans son.h
fichier, c'est tout. Puis il va venir pour voir les erreurs.#include <stdio.h>
avant#include "Opzioni.h"
, et c'est ce fichier qui contient lesprintf
appel. Ainsi, un manque#include <stdio.h>
est pas la cause du comportement signalé dans la question, étant donné que le code indiqué, et cette réponse n'est pas une solution. Cependant, il est probable que le code indiqué dans la question n'est pas le code qui a provoqué le message d'erreur signalé.#include
directive à l'intérieur de la.h
lors de la recherche de définitions de type (j'ai l'habitude d'avoir de tels problèmes avec Visual Studio). C'est encore pire quand on met le code dans le.h
...Le problème est que lorsque le compilateur a rencontré pour la première fois l'appel à printf(), il a fait pour lui-même (c'est, implicitement) une définition comme:
mais plus tard, vous l'appelez avec
de sorte qu'il se plaignait.
Que d'autres affiches ont dit, vous devez inclure à intégrer la bonne définition, et sur le principe de ne pas mettre de code dans les fichiers d'en-tête.
Essayer de mettre le corps de
menu()
dans le.c
fichier source à la place (comme @ouah souligné) et ajouter le#include <stdio.h>
dans votre.h
fichier (comme @Jens indiqué), car il est obligatoire pour votre compilateur pour connaître sa signature.Y compris le code dans un
.h
fichier est PAS bonnes pratiques en C. Certains compilateur peut activer/désactiver les détails lors du traitement de l'un ou de l'autre.