c - 下面的函数定义是如何工作的?

标签 c

#include <stdio.h>
void main() {
    extern int fun(float);
    int a=fun(3.5);
    printf("%d",a);
}

int fun(aa)
float aa;
{
    return ((int)aa);
}

尽管输出是垃圾值,但上面提到的代码块在我的 Visual Studio 8 编译器上编译得很好。但是当我在gcc-4.3.4上编译同样的代码时,出现了如下编译错误:

prog.c:2: warning: return type of ‘main’ is not ‘int’
prog.c:8: error: conflicting types for ‘fun’
prog.c:3: error: previous declaration of ‘fun’ was here

当它具有以下属性时,它将如何工作:

  1. 在函数体开始之前有一个变量声明。
  2. 函数定义中没有变量的参数类型。

最佳答案

该函数是以 K&R 风格编写的,您的原型(prototype)不正确。其实还有其他问题……

#include <stdio.h>
void main() {
    extern int fun(float);
    int a=fun(3.5);
    printf("%d",a);
}

int fun(aa)
float aa;
{
    return ((int)aa);
}

main() 的返回类型是int,至少在标准 C 中是这样。您的打印语句应该包含换行符。

如果函数 fun() 是用原型(prototype)编写的,那么您的原型(prototype)就可以了:

int fun(float aa) { ... }

但是,该函数是以 K&R 风格编写的,因此该函数需要传递一个 double 并将其转换为 float:

int fun(double aa_arg) { float aa = aa_arg; ... }

在 K&R C 中,所有 float 值都作为 double 传递。这就是你得到垃圾的原因;你在(可能是无意中)对你的编译器说谎,而它通过对你执行 GIGO 来收回自己的谎言。

FWIW:GCC 4.6.1 拒绝编译您的代码(即使没有任何警告设置)。它提示:

f1.c: In function ‘main’:
f1.c:2: warning: return type of ‘main’ is not ‘int’
f1.c: At top level:
f1.c:9: error: conflicting types for ‘fun’
f1.c:3: error: previous declaration of ‘fun’ was here

您可以通过多种不同的方式解决此问题:

#include <stdio.h>
int main(void)
{
    extern int fun(float);
    int a = fun(3.5);
    printf("%d\n", a);
    return(0);
}

int fun(float aa)
{
    return ((int)aa);
}

或者:

#include <stdio.h>
int main(void)
{
    extern int fun(double);
    int a = fun(3.5);
    printf("%d\n", a);
    return(0);
}

int fun(double aa)
{
    return ((int)aa);
}

或者:

#include <stdio.h>
int main(void)
{
    extern int fun(double);
    int a = fun(3.5);
    printf("%d\n", a);
    return(0);
}

int fun(aa)
double aa;
{
    return ((int)aa);
}

或者:

#include <stdio.h>
int main(void)
{
    extern int fun(double);
    int a = fun(3.5);
    printf("%d\n", a);
    return(0);
}

int fun(aa)
float aa;
{
    return ((int)aa);
}

或者:

#include <stdio.h>
int main(void)
{
    extern int fun();
    int a = fun(3.5);
    printf("%d\n", a);
    return(0);
}

int fun(aa)
float aa;
{
    return ((int)aa);
}

我相信这些都是正确的,它们都应该在没有警告的情况下编译(除非您要求编译器提示旧式 (K&R) 函数定义等)。

GCC 设置得相当挑剔,我收到警告:

/usr/bin/gcc -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition f2.c -o f2  
f2.c:12: warning: no previous prototype for ‘fun’
/usr/bin/gcc -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition f3.c -o f3  
f3.c:12: warning: no previous prototype for ‘fun’
/usr/bin/gcc -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition f4.c -o f4  
f4.c:12: warning: function declaration isn’t a prototype
f4.c: In function ‘fun’:
f4.c:13: warning: old-style function definition
/usr/bin/gcc -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition f5.c -o f5  
f5.c:12: warning: function declaration isn’t a prototype
f5.c: In function ‘fun’:
f5.c:13: warning: old-style function definition
/usr/bin/gcc -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition f6.c -o f6  
f6.c: In function ‘main’:
f6.c:5: warning: function declaration isn’t a prototype
f6.c: At top level:
f6.c:12: warning: function declaration isn’t a prototype
f6.c: In function ‘fun’:
f6.c:13: warning: old-style function definition

关于c - 下面的函数定义是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8455045/

相关文章:

c - 是否可以重新定义#warning?

c++ - 使用 vlc-qt 拉伸(stretch)视频播放器?

c - 将 .txt 文件拆分为单词并将每个单词存储在数组中

c - 访问文件外部的静态函数

c++ - OpenMP 任务和 Taskwait 构造

java - Android: native 进程在一段时间后引发 ReferenceTable 溢出 (android-ndk)

c - C库如何调用内核系统调用

c - 是什么导致此整数指针重新分配崩溃?

c - Realloc 在 For 循环中不起作用

c - 如果变量不在函数的顶部,则禁用变量声明