2011-10-18 75 views
5

看到一个项目的源代码我已经看到了初级讲座声明静态函数的优点是什么?

static int *foo(); 

所以foo的声明为静态函数返回指针为int。所以我在这里问你最新的功能是静态的吗?

+0

lol @James:'static double *** bzzzt();' – pmg

回答

9

该函数的名称在其声明的翻译单元(源文件)之外是不可见的,并且不会与另一个源文件中的另一个函数foo发生冲突。

一般而言,函数应该声明为static,除非您有特定的需要从另一个源文件调用它。

(请注意,这仅仅是这是不可见的,它仍然可以从程序的任何地方通过指针调用。)

+0

我如何使用指针调用? –

+0

@ Mr.32搜索“功能指针”。 – cnicutar

+1

将一个函数标记为静态并且仅仅将其包含在标题中之间有什么区别?不会从标题中忽略它具有相同的效果?或者,是否有理由不在标题中加入某些内容,也不要将其标记为静态? – Alex

2

它可以防止其他翻译单元(.c文件)看到该功能。保持干净整洁。没有static的功能默认为extern(对其他模块可见)。

+0

没有越过..... –

+0

@JamesMcNellis编辑。 – cnicutar

1

声明函数为static可防止其他文件访问它。换句话说,它只对它声明的文件可见;一个“本地”功能。

您还可以在C中将static(函数声明关键字,不可变)与private在面向对象的语言中联系起来。

查看here举例。

+1

问题是关于[tag:c]。什么是“课堂”? –

+0

我更关心c ...我不知道类和c + + –

+1

@Keith:道歉 - 过去一个月一直在Java编码。 –

1

标记功能或全局变量作为static使得它无形的链接器将当前的翻译单元编译成目标文件。

换句话说,它只在当前翻译单元内具有内部链接。当不使用static或明确使用存储类说明符时,该符号具有外部链接。

2

C99标准:

identi网络ERS

6.2.2的联系。如果一个文件范围identi网络呃对象或函数的声明包含存储类SPECI网络呃静态的,标识符具有内部联系。

在构成整个程序的一组翻译单元和库,每个 声明具有外部链接的特定identi音响ER的表示相同对象或 功能。在一个翻译单元内,每个与内部 连接的标识符声明表示相同的对象或功能。每个没有 连接的标识符声明表示一个独特的实体。

相关问题