繁体   English   中英

C中相同函数的多个隐式声明

[英]Multiple implicit declaration of same function in C

这是我的代码:

int main(){
    printf("Hi");
    int i=10;
    printf("Hi %d",i);
    return 0;
}

现在,由于C可以隐式声明一个函数,因此该程序将正确编译(与gcc一样)。
但是我的问题是,不是第一个printf声明返回具有char *类型的1参数的char *吗?
这会使第二个printf出错。
但是该程序编译时没有错误,只是警告(gcc)。 为什么呢

严格来说,隐式声明是标准违规行为。 它已从标准中删除。

引用C11 ,前言

第二版的主要变化包括:

—删除隐式函数声明

这就是说,在C的早期版本中,这被认为是隐式声明的函数(即编译器之前采用了对函数的原型知识) 本来是要

  • 返回一个int
  • 接受任何数量和类型的参数。

因此,只要函数声明和定义不冲突(例如,返回类型不匹配),就不会出现任何错误。 但是,严格符合要求的编译器必须产生诊断信息。

在您的情况下, printf被隐式定义为int printf(...) ,而不是int printf(char *) ,因此,当您使用其他参数调用编译器时,编译器不会检测到错误。

您的代码不是可移植的C,因为您缺少必不可少的#include ,后者为printf了函数原型:C99中删除了任何类型的隐式声明。

如果要编写不可移植的C,那么最好的办法是查阅编译器文档。 在这种情况下,您友好的编译器似乎默认为int printf(...)

不幸的是,即使没有使用头文件,gcc也有一些内置的printf概念。

unsigned int fun ( unsigned int x )
{
    printf("%s\n");
    printf("%u\n",x);
    more_fun("%s\n");
    more_fun("%u\n",x);
    return(x+1);
}

so.c: In function ‘fun’:
so.c:5:5: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
     printf("%s\n");
     ^
so.c:5:5: warning: incompatible implicit declaration of built-in function ‘printf’
so.c:5:5: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’
so.c:5:12: warning: format ‘%s’ expects a matching ‘char *’ argument [-Wformat=]
     printf("%s\n");
            ^
so.c:7:5: warning: implicit declaration of function ‘more_fun’ [-Wimplicit-function-declaration]
     more_fun("%s\n");
     ^

幸运的是,如果我们自己制造,它至少会遗忘一点。

void printf(char *, unsigned int );
void more_fun(char *, unsigned int );
unsigned int fun ( unsigned int x )
{
    printf("%s\n");
    printf("%u\n",x);
    more_fun("%s\n");
    more_fun("%u\n",x);
    return(x+1);
}

so.c:3:6: warning: conflicting types for built-in function ‘printf’
 void printf(char *, unsigned int );
      ^
so.c: In function ‘fun’:
so.c:7:5: error: too few arguments to function ‘printf’
     printf("%s\n");
     ^
so.c:3:6: note: declared here
 void printf(char *, unsigned int );
      ^
so.c:9:5: error: too few arguments to function ‘more_fun’
     more_fun("%s\n");
     ^
so.c:4:6: note: declared here
 void more_fun(char *, unsigned int );
      ^

但是我们谈论的是一个编译器,一个编译器不能解决这个问题,您必须尝试很多/全部。 无论标准编译器与否,编译器仍会注意到您对该函数的使用进行了更改,并让您知道,该编译器选择不这样做。 这里的错误不是因为编译器没有注意到该函数在一个未声明的实例和另一个未声明的实例之间的用法不同,而是没有声明,然后它确实注意到了所希望的差异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM