2011-10-28 47 views

回答

3

把函数头放在一个头文件(.h)中..我可以建议你找一个好的C教程吗?

+0

你确定这不会造成重复?IMO将为每个编译单元创建一个定义。 –

+0

关键字是'static'。 –

+0

不,它会声明它,但它不会定义符号。 –

0

不知道你是指同一个模块的两个文件是什么意思,但是静态函数的意义在于它们的作用域限于文件,所以你可以做的最好的做法是将一个文件转换为另一个文件而不是链接他们在一起。如果我有权利...

+0

你让我困惑。您可以将静态函数与定义放入头文件中,在这种情况下,您可以在两者中定义它。您可以将一个文件包含到另一个文件中,以便该函数可用于这两个文件并在一次调用中进行编译。那就是 - 文件分离只是为了方便而提供的物理分离(我不会这样做)。或者你可以使它非静态。 –

0

如果函数很短或很简单,您可以在头文件中定义它(也给它的主体)作为一个静态内联函数。

/* in header.h */

static inline int sum3(int a, int b, int c) { return a+b+c; }

但你真的应该读C.编程好书

+0

这是相当草率的练习......它只能在C99中使用。 – Lundin

+0

但是在实践中使用旧的C标准没有意义(至少在学习时)。 –

0

static关键字的主要目的是创建一个将在整个持续时间存在的对象该程序。但是,在文件范围(“全局”)声明的所有对象都以这种方式运行,无论它们是否为静态:它们具有静态存储持续时间

但它也意味着该对象不能被声明的范围之外访问。函数在文件范围(“全局”)处声明,因此静态函数只能从它声明的同一文件访问。因此,在头文件中声明这样的函数是没有意义的。

认为你正在尝试做的是这样的:

// function.h 
void the_func (void); 


// function.c 
#include "function.h" 

static void the_private_func (void); 

void the_func (void) 
{ 
    do_things(); 
    do_private_things(); 
} 

static void the_private_func (void) 
{ 
    ... 
}; 


// some_caller.c 
#include "function.h" 

... 
the_func(); 

至少,这是情理之中的事情在面向对象的设计。

1

这听起来像是相互排斥的要求;您希望在两个翻译单元之间共享函数的单个实现,但是您希望声明它为static,以便其他翻译单元不可见。不幸的是,C不提供这种粒度;一个符号对所有其他翻译单元都是可见的,或者不是。

您可以伪造它通过将功能定义在头文件(声明为static),然后#include它需要它的源文件:

#ifndef FUNC_H 
#define FUNC_H 

static void func() {...} 

#endif 

的事情是,每个翻译单元包括这个文件将会有一个冗余的函数实现。这对你来说可能是或不是一件大事。

个人而言,我只是在自己的翻译单元中正常声明函数,为它创建标题,仅在需要调用该函数的文件中包含标题,并且文档该函数应调用仅调用从这些文件。

相关问题