我刚开始学习C++,有人可以解释一下以下C++函数原型的区别吗?
void f(int n);
extern void f(int n);
static void f(int n);
这更多是关于C语言的问题而非C++,但是:
void f(int n);
extern void f(int n);
声明了一个函数f,它接受一个整型参数,但存在于其他文件中。编译器会相信你已经在某个地方实现了该函数。如果链接器找不到它,你将获得一个链接器错误。
static void f(int n);
声明一个函数f,它接受一个整数参数。static关键字使其变得有趣。如果它在.cpp文件中,该函数只对该文件可见。如果它在.h文件中,每个包含该头文件的.cpp文件将创建自己的该函数副本,仅可访问该实现文件。
f
内部联接,这意味着不同的源文件可以使用名字f
来表示不同的东西。static
。而应该使用一个匿名命名空间:namespace { // anonymous
void f(int n);
}
static
关键字已经足够重载了。 - Charles Salvia匿名命名空间是一种更通用和更清洁的解决方案,您可以在其中拥有函数、变量和类。而static
则是一个过于重载的术语,在某些情况下意味着内部链接,在其他情况下则意味着静态生命周期。
然而,匿名命名空间有一个缺点。由于外部链接,您的对象/库文件的导出部分将膨胀,并包含所有这些长长的<unique namespace name>::<function>
名称,如果它们是静态的,则不会存在这些名称。