C++的一个特性是能够创建未命名(匿名)命名空间,如下所示:
namespace {
int cannotAccessOutsideThisFile() { ... }
} // namespace
Run Code Online (Sandbox Code Playgroud)
您会认为这样的功能是无用的 - 因为您无法指定命名空间的名称,所以无法从外部访问其中的任何内容.但是这些未命名的命名空间可以在它们创建的文件中访问,就好像你有一个隐含的using子句.
我的问题是,为什么或何时使用静态函数会更好?或者他们基本上是两种做同样事情的方式?
问题是关于普通c函数,而不是c ++ static方法,正如评论中所阐明的那样.
好的,我理解static变量是什么,但什么是static函数?
为什么如果我声明一个函数,让我们说void print_matrix,让我们说a.c(WITHOUT a.h)和include "a.c"- 我得到"print_matrix@@....) already defined in a.obj",但是如果我声明它static void print_matrix然后它编译?
更新只是为了清理 - 我知道包括.c很糟糕,正如你们许多人指出的那样.我只是做它在暂时清除空间main.c,直到我有更好的想法如何将所有这些功能集成到适当.h和.c文件.只是一个临时的快速解决方案.
未命名的命名空间如何优于static关键字?
可能重复:
静态关键字的弃用...不再?
在C++ 2003中,static不推荐使用namespace- :
[C++03: 7.3.1.1/2]:static在声明命名空间范围内的对象时,不推荐使用该关键字(见附录D); 所述 未命名的命名空间提供了一个更好的选择.
我无法找到C++ 2011中存在任何此类子句的位置(建议不引用),并且7.1.1似乎没有禁止命名空间 - static(如果有的话,这表明该功能最终已从语言中删除); 然而,这两个案例都没有列入C.2(这表明2003年和2011年之间存在重大差异).
名称空间是否static未被提及?
在C++中,将函数或变量放在匿名命名空间中会使其内部链接,即与static在文件级别上声明它相同,但却是惯用的C++.
普通命名空间中的匿名命名空间怎么样?它仍然保证内部联系吗?
// foo.cpp
void func1() {
// external linkage
}
static void func2() {
// internal linkage
}
namespace {
void func3() {
// internal linkage
}
}
namespace ns1 {
void func4() {
// external linkage
}
namespace {
void func3() {
// still internal linkage?
}
}
}
Run Code Online (Sandbox Code Playgroud) 我希望有一个静态函数,我在定义之前在我的.c文件中声明:
//file a.c version 1
static int foo();
...
static int foo()
{
...
}
Run Code Online (Sandbox Code Playgroud)
但是,似乎我可以将static关键字从函数定义中删除,并且我没有得到编译器警告......例如
//file a.c version 2
static int foo();
...
int foo()
{
...
}
Run Code Online (Sandbox Code Playgroud)
假设这两种形式完全相同,我是否正确?
如果是这样,为什么允许这种差异,我应该使用哪种形式?
我理解使用未命名的命名空间来使函数和变量具有内部链接.头文件中不使用未命名的命名空间; 只有源文件.源文件中声明的类型不能在外部使用.那么在未命名的命名空间中放置类型有什么用呢?
请参阅这些链接,其中提到的类型可以放在未命名的命名空间中:
假设您具有以下非静态成员函数:
// .h
struct C {
void f();
}
Run Code Online (Sandbox Code Playgroud)
现在假设您希望C::f通过使用一些特定的子函数来实现C::f,以使其更短且更易读; 例如:
// .cpp
void C::f() {
h1();
h2();
//...
hn();
}
Run Code Online (Sandbox Code Playgroud)
假设许多h()函数不需要访问任何数据成员.这意味着您可以将函数定义为静态自由函数(在一个.cpp中)或作为成员函数(静态或非静态).
你会让它们成为静态自由函数或C的函数成员吗?
第一种情况的一个优点是您不必在以下情况下声明它们C:
// .cpp
static void h1() {//...}
static void h2() {//...}
static void hn() {//...}
Run Code Online (Sandbox Code Playgroud)
此外,如果我没有错,则不存在全局命名空间污染的风险,因为它们是静态的,即它们只能从同一单元.cpp内的其他函数中看到(其中C :: f也被定义).
而在第二种情况下,你将不得不声明它们C,虽然,正如我所说,它们只应该被使用C::f.
// .h
struct C {
void f();
private:
static void h1(); // can be either static or non-static
static void h2();
static void hn();
}
// …Run Code Online (Sandbox Code Playgroud) c++ ×9
static ×4
c ×3
namespaces ×3
c++11 ×2
function ×2
anonymous ×1
declaration ×1
linkage ×1
terminology ×1