我有一个大问题。 这是我创建的头文件,有一个小终端菜单。 问题是,在功能"菜单" (意大利名字),当我编译它时,我得到一个警告说 " [警告]内置函数的不兼容隐式声明' printf' [默认启用]" 如果我运行它就会崩溃。
#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
此处是源文件:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Opzioni.h"
int main(){
nuovaOpzione("Ciao");
nuovaOpzione("Bellaaa");
nuovaOpzione("Hey");
menu();
getch();
return 0;
}
我只是变得疯狂,是的,我在其他问题上搜索了很多帮助...... 如果你这样做,谢谢你的帮助! :P
btw:&#34; nuovaOpzione&#34;中的strcpy函数也是一个警告,但是你好......
答案 0 :(得分:2)
你忘记了包含:
#include <stdio.h>
答案 1 :(得分:1)
Jens对printf警告是正确的。
对于崩溃,根据您的程序,您需要opz
的数组,而不是指针。
struct Opzione opz[1000];
答案 2 :(得分:0)
内置函数'printf
的不兼容隐式声明
问题在于,当编译器第一次遇到对printf()的调用时,它就会自己(即隐式地)定义如下定义:
printf(char [],char)
但稍后你用
打电话的printf(炭[])
所以抱怨。
正如其他海报所说,你应该加入适当的定义,原则上不要把代码放在头文件中。
答案 3 :(得分:0)
尝试将menu()
的正文放入.c
源文件中(如@ouah指出)并在#include <stdio.h>
文件中添加.h
(如@Jens指示),因为编译器必须知道它的签名。
在.h
文件中包含代码是C中的 NOT 良好做法。某些编译器可能会在处理其中一个时打开/关闭细节。