在main()之前,之后或之内声明函数是否有优势?

flo*_*380 4 c program-entry-point declaration function

我正在尝试为嵌入式系统学习C语言。目前,我正在学习基础知识,但找不到一个基本问题的答案。当我编写一个简单的C程序时,我以三种方式声明了一个名为maximum()的函数。我将通过以下示例对其进行解释:

1-)在下面的程序中,该函数在main之外和main之前声明:

#include <stdio.h>

int maximum(int x, int y)
 {
    int z;
    z = (x >= y) ? x : y;
    return z;
}

int main(void)
{
    int result = maximum(30, 50);
    printf("%d", result);
    return(0);
}
Run Code Online (Sandbox Code Playgroud)

2-)现在,在主函数的外部和之后声明该函数的下面:

#include <stdio.h>    

int main(void)
{
    int result = maximum(30, 50);
    printf("%d", result);
    return(0);
}

int maximum(int x, int y)
 {
    int z;
    z = (x >= y) ? x : y;
    return z;
}
Run Code Online (Sandbox Code Playgroud)

3-)最后,在主函数内部声明以下函数:

#include <stdio.h>

int main(void)
{
    int maximum(int x, int y)
 {
    int z;
    z = (x >= y) ? x : y;
    return z;
 }
    int result = maximum(30, 50);
    printf("%d", result);
    return(0);
}
Run Code Online (Sandbox Code Playgroud)

我尝试了所有上述操作,并且所有执行均无错误。有什么理由比别人更偏爱一个吗?

Joh*_*ger 6

从C99开始,在标准C中,必须在调用函数之前声明它们。这告诉编译器期望返回值的类型,应该传递多少个参数,以及如何转换它们以正确匹配函数的参数类型。该声明不必是函数的定义,但是通常不是。

在这方面,您的(1)很好,但是您的(2)不合格。但是,(2)碰巧具有与较早的C调用未声明函数的期望一致的返回值和参数类型,许多编译器会接受它并在某些情况下对它执行正确的操作。

您的(3)以不同的方式不一致:C不允许嵌套函数。您可以将一个函数声明放在另一个函数中,尽管这样做没有什么好处,但是没有一个完整的函数定义。我知道一个编译器系列确实接受了它作为扩展,也许其他人也接受了,但是在任何情况下都不应该依赖它。

因此,在提出的三种选择中,(1)是您应该使用的唯一选择。如果您想拥有更大的自由放置maximum()函数,则在文件顶部附近提供带有原型的前向声明:

(4)

#include <stdio.h>    

// Forward declaration, including prototype:
int maximum(int x, int y);

int main(void)
{
    int result = maximum(30, 50);
    printf("%d", result);
    return(0);
}

int maximum(int x, int y)
 {
    int z;
    z = (x >= y) ? x : y;
    return z;
}
Run Code Online (Sandbox Code Playgroud)


JL2*_*210 5

选项1是有效的并且可以使用,但是它倾向于main在程序末尾隐藏该函数。

从C99开始,选项2无效,因为C99 int不再有“默认值”。

选项3无效,尽管许多编译器都支持它。

我建议将选项1和2混合使用。先声明函数原型,然后main在文件中定义它:

#include <stdio.h>    

int maximum(int x, int y);

int main(void)
{
    int result = maximum(30, 50);
    printf("%d", result);
    return(0);
}

int maximum(int x, int y)
 {
    int z;
    z = (x >= y) ? x : y;
    return z;
}
Run Code Online (Sandbox Code Playgroud)