“静态”功能的原型

时间:2012-01-23 13:24:41

标签: c standards

我不太确定是否真的有必要在C中使用静态函数的原型。只要我没有输出这样的函数(即它们没有外部链接),这会带来什么其他好处? ?

感谢。

6 个答案:

答案 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]。