C99中是否需要函数声明/原型?
我目前正在头文件中定义我的函数,并在主文件中定义#include-ING。这在C99中可以吗?
为什么大多数程序员在main()之前声明/原型化函数并在main()之后定义它?是不是更容易在main之前定义它们并避免所有的声明/原型?
header.h文件的内容:
int foo(int foo)
{
// code
return 1;
}
主文件的内容:
#include <stdio.h>
#include "header.h"
int main(void)
{
foo(1);
return 0;
}
答案 0 :(得分:13)
如何以及在何处创建并在C中定义函数:
您的函数仅用于特定的.c文件: 在.c文件中将其定义为静态。该功能仅对该文件可见并编译。
您的函数用于多个.c文件: 选择一个合适的c文件来托管你的定义(例如foo.c文件中所有foo相关的函数),并有一个相关的头文件,让所有非静态(思考公共)函数原型化。该函数只编译一次,但对包含头文件的任何文件都可见。一切都将在链接时汇集在一起。可能的改进:总是生成相关的头文件,第一个包含在其c文件中,这样,您将确保任何文件都可以安全地包含它而无需其他包含使其工作,参考:{{3} (大多数规则也适用于C)。
你的功能是无法使用的(你确定它是吗?): 在适当的头文件中定义静态内联函数。如果可能的话,编译器应该通过定义替换对函数的任何调用(想像宏一样)。
c中前后另一个函数(你的主函数)的概念只是风格问题。要么你这样做:
static int foo(int foo)
{
// code
return 1;
}
int main(void)
{
foo(1);
return 0;
}
或者
static int foo(int foo);
int main(void)
{
foo(1);
return 0;
}
static int foo(int foo)
{
// code
return 1;
}
将导致相同的程序。第二种方式是程序员首选,因为每次声明使用其他函数的新函数时,您不必重新组织或声明新原型。另外,您可以获得文件中声明的每个函数的清单。从长远来看,它可以让您和您的团队更轻松。
答案 1 :(得分:5)
人们通常会这样做,因为使用多个文件更容易。如果您在标题中声明,那么您可以在需要这些功能的任何地方#include该标题。如果您在标题中定义它们,然后包含在另一个翻译单元中,请执行。
答案 2 :(得分:4)
您应该只在标头中定义inline
个功能。虽然您可以使用extern inline
个功能,但常见的情况是static inline
。
标题文件的经验法则:
extern
static inline
extern
static const
正如C.罗斯所要求的那样,这背后的推理:具有外部联系的资源应该只定义一次[1]。因此,定义不应存在于头文件中,头文件应包含在多个位置。
在头文件中定义static
不会导致任何问题,但通常不赞成,因为代码必须被编译多次并且将出现在不同的目标文件中,这将增加可执行文件大小(假设链接器不够智能,无法找出代码重复)。
此规则的常见例外是常量和inline
函数,这些函数应该在每个转换单元中对编译器可见,以便进一步优化。
注意: [1]这不适用于具有外部链接的inline
函数,但由于未指定内联函数的多个定义中的哪一个将用于评估一个功能指示符,它们几乎没用了
答案 3 :(得分:4)
C99中需要函数声明。 C99中不需要函数原型。
在调用点之前声明函数并在调用之后定义它们是构造程序代码的流行方法。但是,这绝不是“大多数”程序员所做的。相反,更流行的方法是在第一次调用之前定义函数,在这种情况下,不需要单独的声明。这种方法需要较少的维护,这就是为什么它比你描述的更受欢迎。
单独的声明/定义通常仅用于外部函数,即跨多个转换单元使用的函数。这些函数在头文件中声明并在实现文件中定义。
答案 4 :(得分:3)
您的方法适用于小型程序。头文件用于声明和常量定义 - 它们为它们“封装”的程序提供接口。标题是指其他程序单元的接口。
如果你有更多.c文件,前向声明和头文件是必要的,因为C函数只能为整个程序定义一次(搜索一个定义规则),即使你可以在任何地方使用该函数(在任何.c文件中)。如果您在标题中定义它,它将包含在您使用它的所有.c文件中并导致多个定义。
答案 5 :(得分:1)
是的,在main之前定义它们更容易。如果您只想在文件中使用这些函数,则不需要原型。但是,在这种情况下,您还可以在函数定义之前添加“static”关键字。 (在C文件中。)这将确保该功能对其他文件不可见。 (在链接时。)
不要在包含文件中放置静态关键字。
答案 6 :(得分:1)
这样做比较快,但我个人更喜欢在主文件的开头放置main函数,并将其他函数放在其他文件中或main下面。
请注意,在您的示例中,您应该避免在头文件中声明foo():您将无法将其包含在两个不同的源文件中。在包含main()的C文件中声明它;除非你从其他文件中引用它,否则你不需要在别处定义它。
答案 7 :(得分:0)
你应该总是原型。
原因是:
有条不紊的原型设计在代码中的函数的头文件中生成一个简洁的列表 - 这对未来的读者来说非常宝贵
除了最简单的项目之外,很多函数在main之前都没有可见性。
main应该是其文件中的第一个函数;这对读者来说更容易,因为我们读了下来,而不是
答案 8 :(得分:0)
为什么大多数程序员在main()之前声明/原型化函数并在main()之后定义它?
仅仅是因为大多数人依次阅读。从头开始讲故事,而不是从中间开始。没必要,只是直观。
当然,如果原型的代码是在一个单独的编译单元中,原型是是必需的。
答案 9 :(得分:0)
在main之前或单独的头文件中声明函数总是一个好习惯,它将包含在我们使用该函数的其他c文件中。通过这样做,我们可以轻松识别在.C或.H文件中声明/定义的所有函数。在声明头文件中的函数之前,我们应该使用extern关键字。