2010-12-06 113 views
4

我刚开始学习C++。有人可以解释下面的C++函数原型之间的区别吗?C++函数原型

void f(int n); 
extern void f(int n); 
static void f(int n); 

回答

11

void和extern void版本相同。它们表明函数具有外部链接(即函数的定义可能来自其他C或C++文件)。 Static表示该函数具有内部链接,并且仅存在于当前C++文件中。

您几乎从来没有看到这些说明符适用于函数,因为99.9%的时间需要默认的extern行为。

您可能会在全局变量上看到staticextern存储说明符,这通常是为了减少与同一项目中其他文件的名称冲突。这是C的延期;如果你使用C++,这种事情应该使用匿名命名空间而不是static来完成。

+4

轻微nitpick:第一个不*必然*表示外部链接。它可以简单地作为函数定义的前向声明,稍后将出现在同一个翻译单元中。 – 2010-12-06 19:23:18

+0

@Charles:如果函数存在于同一个实现文件中,那么它将被同一文件导出供其他文件使用,在这种情况下,它仍然具有外部链接。 (虽然你认为这个函数本身不需要来自另一个翻译单元) – 2010-12-06 19:24:56

3

前两个是一样的东西。第三个给出f内部链接,这意味着一个不同的源文件可能使用名称f是不同的。

不应使用static与第三个示例中的一样。相反,使用匿名命名空间:

namespace { // anonymous 
    void f(int n); 
} 
4

这比C++的一个C语言问题,而是:

void f(int n); 

声明一个函数f接受单个整型参数。

extern void f(int n); 

声明一个函数f,该函数只接受一个整数参数,但存在于其他文件中。编译器会相信你已经在某处实现了该函数。如果链接程序找不到它,您将收到链接程序错误。

static void f(int n); 

声明一个函数f,它取单个整数参数。静态关键字使这个有趣。如果这是在.cpp文件中,该功能只对该文件可见。如果它在.h文件中,那么包含该头文件的每个.cpp文件都将创建该函数的副本,该副本只能由该实现文件访问。

0

到目前为止,这两个答案都不赞成使用静态函数。为什么?是什么让

命名空间{
void f(int n);
}

优于

静态无效F(INT N);

?这并不简单,它不容易理解......

0

匿名命名空间是一个更通用和更干净的解决方案,你可以有它的功能,变量,类。并且static在一些情况下意味着内部链接,在其他静态生命周期中过度负载。
尽管匿名命名空间有一个缺点。由于外部链接,对象/库文件的导出部分将随着所有那些长期不会存在的名字而膨胀,这些名称不会是静态的。