我不太确定是否真的有必要在C中使用静态函数的原型。只要我没有输出这样的函数(即它们没有外部链接),这会带来什么其他好处? ?
感谢。
答案 0 :(得分:8)
引用一些权威,MISRA-C:2004规则8.1强制执行具有外部链接的功能的原型,但也提到了内部联系:
“为具有内部联系的功能提供原型是 良好的编程实践。“
我认为这是一种很好的做法,因为它使得内部/外部链接功能之间的编码风格保持一致。正如其他人在答案中提到的那样,它也很方便。
答案 1 :(得分:6)
如果你想在实现之前使用它们,你应该写一个原型。
通常,您可以更改函数的顺序,但是如果您有两个相互调用的静态函数会怎么样?
答案 2 :(得分:6)
E.g。如果你需要确保一个函数有某种类型,它就会很有用。
考虑一下:
// Define how the functions should be defined.
typedef void * jobfunc(void *);
// Use case
void addjob(jobfunc *);
// Ensure they have the right type. Without this, you only get a warning
// for addjob(job2) (see below) - with it, you get an error for the mismatch.
static jobfunc job1;
static jobfunc job2;
// Define one job
static void * job1(void * arg) {
return NULL;
}
// Define another job - accidentally wrong.
static void * job2(int accidentally_wrong) {
return NULL;
}
答案 3 :(得分:4)
没有static
函数定义的声明(这对于extern
函数是相同的)允许您在定义函数之前调用函数。在C中,必须先声明函数的标识符,然后才能使用它:
static void foo(void);
void bar(void)
{
foo();
}
static void foo(void)
{
...
}
答案 4 :(得分:3)
一个(次要的)便利性是它允许您将函数放在文件中的任何位置。例如,如果要将实用程序函数放在文件末尾,则必须声明它们。
你必须声明你的函数的情况是你有两个相互递归的函数,因为在文件中首先放置的函数还没有看到另一个函数。
答案 5 :(得分:0)
如果你不宣布函数原型,下面的代码将是有效的。
static int bar()
{
};
int foo()
{
bar("asdf" );
};
这种隐藏的错误可能很危险。再次检查“2 7 .2.2函数参数类型检查”部分可能是有用的原理和实践使用C ++ [Bjarne Stroustrup]。