内置函数“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 &lt;stdio.h&gt;不在"Opzioni.h"中,但#include &lt;stdio.h&gt;在做#include "Opzioni.h"之前已经包含在main.c中,所以这个警告是意料之外的。我认为发布的内容与 OP 的编译不同,或者另一个 .c 文件包含“Opzioni.h”而没有前面的 #include &lt;stdio.h&gt; 还怀疑用“内置”字样来描述printf()的警告。 【参考方案1】:

您忘记了包含:

#include <stdio.h>

【讨论】:

在包含“Opzioni.h”之前似乎包含了stdio.h 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。 @ŁukaszL。为什么你认为它没有回答这个问题?标题中出现的错误信息就是,编译器对printf 的声明感到困惑。可能他正在尝试单独编译.h 文件,作为单独的编译单元。为了使 那个 错误消失,他必须在他的.h 文件中包含stdio.h,就是这样。然后他会来看下一个错误。 您的答案在迟到的答案队列中。它没有提供任何解释。并且包含在 OP 的代码中。 除非OP在输入问题后快速编辑了问题(这样Stack Overflow不会显示它已被编辑),然后,当输入这个答案时,问题中显示的代码包含#include &lt;stdio.h&gt;之前#include "Opzioni.h",它是包含printf 调用的后一个文件。因此,在给出所示代码的情况下,缺少#include &lt;stdio.h&gt; 不是问题中报告的行为的原因,并且此答案不提供解决方案。但是,问题中显示的代码很可能不是导致报告错误消息的代码。【参考方案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 &lt;stdio.h&gt; 添加到您的.h 文件中(如@Jens 指出的那样),因为它是强制性的你的编译器知道它的签名。

.h 文件中包含代码是在 C 中的良好做法。某些编译器可能会在处理其中一个或另一个时打开/关闭细节。

【讨论】:

以上是关于内置函数“printf”的不兼容隐式声明的主要内容,如果未能解决你的问题,请参考以下文章

C中函数的隐式声明

关于gcc内置函数和c隐式函数声明的认识以及一些推测

C#显式声明隐式声明是怎么定义的

函数“printf”隐式声明啥意思,该如何解决此问题?

函数的隐式声明是啥意思?

oracle的内置函数