内置函数“printf”的不兼容隐式声明
Posted
技术标签:
【中文标题】内置函数“printf”的不兼容隐式声明【英文标题】:incompatible implicit declaration of built-in function 'printf" 【发布时间】:2013-12-28 15:44:37 【问题描述】:我有一个大问题。 这是我创建的具有小终端菜单的头文件。 问题是,在函数 "menu" (italian name) 中,当我编译它时,我收到一条警告,上面写着 “[警告]内置函数'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
顺便说一句:“nuovaOpzione”中的 strcpy 函数也是一个警告,但是 yolo...
【问题讨论】:
不要将函数体放在头文件中。 你的头文件中有函数定义吗?如果是,则应将其移至源文件。 你的编译器/链接器命令是什么样的? 虽然#include <stdio.h>
不在"Opzioni.h"
中,但#include <stdio.h>
在做#include "Opzioni.h"
之前已经包含在main.c中,所以这个警告是意料之外的。我认为发布的内容与 OP 的编译不同,或者另一个 .c 文件包含“Opzioni.h”而没有前面的 #include <stdio.h>
。
还怀疑用“内置”字样来描述printf()
的警告。
【参考方案1】:
您忘记了包含:
#include <stdio.h>
【讨论】:
在包含“Opzioni.h”之前似乎包含了stdio.h 。 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。 @ŁukaszL。为什么你认为它没有回答这个问题?标题中出现的错误信息就是,编译器对printf
的声明感到困惑。可能他正在尝试单独编译.h
文件,作为单独的编译单元。为了使 那个 错误消失,他必须在他的.h
文件中包含stdio.h,就是这样。然后他会来看下一个错误。
您的答案在迟到的答案队列中。它没有提供任何解释。并且包含在 OP 的代码中。
除非OP在输入问题后快速编辑了问题(这样Stack Overflow不会显示它已被编辑),然后,当输入这个答案时,问题中显示的代码包含#include <stdio.h>
之前#include "Opzioni.h"
,它是包含printf
调用的后一个文件。因此,在给出所示代码的情况下,缺少#include <stdio.h>
不是问题中报告的行为的原因,并且此答案不提供解决方案。但是,问题中显示的代码很可能不是导致报告错误消息的代码。【参考方案2】:
Jens 对 printf 警告的看法是正确的。
对于崩溃,根据您的程序,您需要opz
的数组,而不是指针。
struct Opzione opz[1000];
【讨论】:
可能还需要为strcpy(opz[numeroOpz].testo, testoOpz)
分配内存。
@Eric Postpischil OP 在帖子中指出了 2 个问题:“当我编译它时,我收到一个警告……”和“如果我运行它就会崩溃”。该解决方案确实解决了警告(简洁)和崩溃部分。【参考方案3】:
内置函数'printf的隐式声明不兼容
问题在于,当编译器第一次遇到对 printf() 的调用时,它为自己(即隐式地)弥补了如下定义:
printf(char[], 字符)
但后来你用它来调用它
printf(char[])
所以它抱怨了。
正如其他发帖者所说,您应该包含以包含正确的定义,并且原则上不要将代码放在头文件中。
【讨论】:
【参考方案4】:尝试将menu()
的主体放在.c
源文件中(正如@ouah 指出的那样)并将#include <stdio.h>
添加到您的.h
文件中(如@Jens 指出的那样),因为它是强制性的你的编译器知道它的签名。
在.h
文件中包含代码是不在 C 中的良好做法。某些编译器可能会在处理其中一个或另一个时打开/关闭细节。
【讨论】:
以上是关于内置函数“printf”的不兼容隐式声明的主要内容,如果未能解决你的问题,请参考以下文章