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文件.只是一个临时的快速解决方案.
C++标准中的$ 7.3.1.1/2节描述如下:
在声明命名空间作用域中的对象时,不推荐使用static关键字; unnamed-namespace提供了一个更好的选择.
我不明白为什么一个未命名的命名空间被认为是一个更好的选择?理由是什么?我已经知道标准的内容很长一段时间,但我从未认真考虑过,即使我回答这个问题:未命名的命名空间优于静态?
它是否被认为是优越的,因为它也可以应用于用户定义的类型,正如我在回答中所描述的那样?还是有其他原因,我不知道?我问这个问题,特别是因为这是我在答案中的推理,而标准可能会考虑其他因素.
在C++中,可以static在翻译单元中使用关键字来影响符号的可见性(变量或函数声明).
在n3092,这被弃用了:
附件D.2 [depr.static]
在命名空间范围内声明对象时,不推荐使用static关键字(见3.3.6).
在n3225中,这已被删除.
它确实强调,为了与C兼容(以及将C程序编译为C++的能力),弃用令人讨厌.但是,直接将C程序编译为C++本身就是一种令人沮丧的经历,所以我不确定它是否值得考虑.
有谁知道为什么它被改变了?
何时在C++中使用未命名的命名空间?在任何意义上它比独立功能更好吗?是否应该仅在源文件中使用而不在头文件中使用?
我最近遇到过这个:
static enum Response{
NO_ERROR=0,
MISSING_DESCRIPTOR,
...
};
Run Code Online (Sandbox Code Playgroud)
它在Microsoft VS2005下编译和工作.但是,我不确定'静态'修饰符应该做什么.它与以下有何不同?
enum Response {
NO_ERROR=0,
MISSING_DESCRIPTOR,
...
};
Run Code Online (Sandbox Code Playgroud) namespace N
{
static int x = 5;
}
Run Code Online (Sandbox Code Playgroud)
在命名空间范围内声明拥有静态变量的重要性/用例是什么?
标记变量是否有用static,当它位于.cpp文件的全局范围内时,不在函数中?
你也可以将static关键字用于函数吗?如果是的话,它们的用途是什么?
我刚刚写了一个包含一些静态数据成员的类,但现在我收到有关"未定义引用"的错误.为什么这不起作用?我究竟做错了什么?
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)