1

我有以下程序

main()
{
   char a,b;
   printf("will i get the job:");
   scanf("%c",&a);
   printf("%c",a);
   printf("We did it");
}

我将文件保存为Hope.c. 当我尝试用 gcc 编译器编译上面的代码时,我会得到以下错误:

Hope.c:In function 'main':
Hope.c:4:2:warning:incompatible implicit declaration of built-in function 'printf' [enabled by default]          
Hope.c:5:2:warning:incompatible implicit declaration of built-in function scanf[enabled by default]

当我使用printf()or时scanf(),即使在简单的“Hello world”程序中,编译器也会出现此错误。

我的代码有问题,还是编译器有问题?

4

4 回答 4

6

#include <stdio.h>在顶部失踪了。请注意,这些是警告,而不是错误。您的程序应该仍然按原样编译。

此外,为了更好地衡量,您应该将返回类型和参数写出 main() 并在最后返回一个值。

#include <stdio.h>

int main(void)
{
   char a,b;
   printf("will i get the job:");
   scanf("%c",&a);
   printf("%c",a);
   printf("We did it");

   return 0;
}
于 2013-08-22T15:54:22.970 回答
4

当您调用您不熟悉的函数时,请查看手册页并包含其中提到的标题。在#include <stdio.h>你的情况下。

这真的很重要,例如我经历过printf( "%s", func( ) )导致分段错误,虽然func()返回了一个有效的空终止字符串,但是没有原型声明返回类型为func()as char *(做了一点研究,我们发现只有最后四个字节64 位指针已传递给printf())

于 2013-08-22T15:53:54.763 回答
2

是的,代码有问题。您正在使用这些功能printf并且scanf没有声明它们。

通常要做的事情是使用编译器附带的声明(因为它们已知是正确的)

#include <stdio.h>
于 2013-08-22T15:54:13.067 回答
2

C.89/C.90 允许隐式声明函数。您的警告消息通知您没有为scanf和提供明确的声明printf。如前所述,您可以通过添加#include <stdio.h>到程序的开头来纠正此问题。如果不这样做,您的程序的行为是不确定的。

因为scanf()printf()具有隐式声明,所以它们被视为其原型被视为:

extern int scanf ();
extern int printf ();

这些声明声明scanf()printf()接受未知数量的参数并返回和int。但是,这种声明仍然假定这些函数将采用固定数量的参数。这与它们的真实原型不兼容,其中它们采用可变数量的参数:

extern int scanf (const char *, ...);
extern int printf (const char *, ...);

您的 C 编译器显然知道这些函数的真正原型,因为它将这些函数视为“内置”,这意味着它可以在编译为调用这些函数的源代码时生成特殊情况代码。由于隐式声明与其原型的内置知识不匹配,因此它生成了警告。

没有这种“内置知识”的编译器可能不会生成警告。然后它会生成要调用的代码,scanf()printf()好像它们采用了固定数量的参数一样。该错误可能会在运行时发生,因为采用可变数量参数的函数的调用约定可能与采用固定数量参数的函数的调用约定不同。

这在 C.89 §3.3.2.2 中有全部描述。

如果函数调用中带括号的参数列表之前的表达式仅包含一个标识符,并且如果该标识符没有可见的声明,则该标识符被隐式声明,就好像在包含函数调用的最里面的块中,声明
extern int identifier();
出现了.
...
如果表示被调用函数的表达式的类型不包含原型,则对每个参数执行整数提升,并且浮点类型的参数提升为双精度。...如果函数定义的类型包含原型,并且提升后的参数类型与参数类型不兼容,或者原型以省略号(“ , ...”)结尾,则行为为不明确的。

请注意,C.99 删除了对隐式函数声明的允许。

于 2013-08-22T16:39:39.480 回答