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)
我尝试了所有上述操作,并且所有执行均无错误。有什么理由比别人更偏爱一个吗?
从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)
选项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)