相关疑难解决方法(0)

未命名/匿名命名空间与静态函数

C++的一个特性是能够创建未命名(匿名)命名空间,如下所示:

namespace {
    int cannotAccessOutsideThisFile() { ... }
} // namespace
Run Code Online (Sandbox Code Playgroud)

您会认为这样的功能是无用的 - 因为您无法指定命名空间的名称,所以无法从外部访问其中的任何内容.但是这些未命名命名空间可以在它们创建的文件访问,就好像你有一个隐含的using子句.

我的问题是,为什么或何时使用静态函数会更好?或者他们基本上是两种做同样事情的方式?

c++ namespaces

486
推荐指数
8
解决办法
20万
查看次数

什么是"静态"功能?

问题是关于普通函数,而不是 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 static terminology function

465
推荐指数
11
解决办法
55万
查看次数

118
推荐指数
3
解决办法
3万
查看次数

static和const变量有什么区别?

有人可以解释一个staticconst变量之间的区别吗?

c c++ static const

62
推荐指数
6
解决办法
11万
查看次数

根据标准委员会的说法,为什么匿名命名空间不能完全替代namespace-static?

根据这个答案,命名空间范围的静态变量在C++ 11中是未被完美的.也就是说,它们在C++ 03中被弃用,因为匿名命名空间被认为更好.但是C++ 11对它们不予重视.

为什么?N3296将其原因列为:

不应该弃用在命名空间范围中使用静态.匿名命名空间不足以替代该功能.

这显然是委员会接受的.为什么?什么是匿名命名空间不完全取代此功能?

我更喜欢那些有标准委员会讨论的文件或书面记录的答案.

c++ c++11

50
推荐指数
3
解决办法
8686
查看次数

C++,静态与命名空间与单例

我已经在网上阅读了很多帖子和文章,但我找不到明确的答案.

我有一些具有类似用途的功能,我想要超出全局范围.其中一些需要公开,另一些应该是私有的(因为它们只是"公共"功能的辅助功能).另外,我不仅有函数,还有变量.它们只需要"私人"帮助函数,也应该是私有的.

现在有三种方式:

  • 创建一个静态的类(反对:潜在的"不能在没有对象的情况下调用成员函数" - 并不是所有东西都需要是静态的)
  • 制作单身类(反对:我需要对象)
  • 创建命名空间(没有私有关键字 - 为什么我要把它放在命名空间中呢?)

对我采取什么方式?结合其中一些方法的可能方法?

我想到了类似的东西:

  1. 制作单例,静态函数使用单例对象的辅助函数(这可能吗?我仍然在类中,但访问它的类型的对象)
  2. 在programm start调用的构造函数,初始化所有东西( - >确保静态可以从单例对象访问函数)
  3. 仅通过MyClass :: PublicStaticFunction()访​​问公共函数

谢谢.

c++ singleton static namespaces

30
推荐指数
2
解决办法
1万
查看次数

在全局范围内使用静态变量和函数

标记变量是否有用static,当它位于.cpp文件的全局范围内时,不在函数中?

你也可以将static关键字用于函数吗?如果是的话,它们的用途是什么?

c++ static global global-variables static-variables

21
推荐指数
2
解决办法
2万
查看次数

在C++ 11中,namespace-`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++ c++11

20
推荐指数
1
解决办法
1992
查看次数

静态const对命名空间成员有什么影响

// MyClass.h

namespace MyNamespace {

  static const double GasConstant = 1.987;

  class MyClass
  {
    // constructors, methods, etc.
  };
}
Run Code Online (Sandbox Code Playgroud)

我以前在MyClass声明中声明了GasConstant(并且在源文件中有一个单独的定义,因为C++不支持const非整数类型的初始化).然而,我需要从其他文件访问它,从逻辑上看,它似乎应该驻留在命名空间级别.

我的问题是,static const在这种情况下会产生什么影响?显然const意味着我无法为GasConstant分配新值,但命名空间中的静态成员意味着什么.这类似于文件范围内的静态,其中成员在单元外是不可访问的吗?

c++ static namespaces const

15
推荐指数
1
解决办法
1万
查看次数

不必要地使用未命名的命名空间C++

我一直在公司里看到这样的代码:

namespace {

const MAX_LIMIT = 50;
const std::string TOKEN = "Token";

}
Run Code Online (Sandbox Code Playgroud)

我很困惑,为什么你需要一个匿名命名空间.一方面,您需要MAX_LIMITAND 的本地翻译单元TOKEN.但是,由于这个原因,没有匿名命名空间就已经实现了const.static const而且简单const都实现了本地翻译单元.

另一方面,如果文件中的某个地方有一个名为相同的变量,则没有命名冲突.

int foo()
{
std::string TOKEN = "MyToken"; // Clash! ::TOKEN vs TOKEN can be used.
}
Run Code Online (Sandbox Code Playgroud)

这将证明匿名命名空间的合理性.但是,您在函数中需要一个变量名称的频率实际上是在函数const外部声明的变量吗?我的回答永远不会.所以在实践中,对我来说不需要未命名的命名空间.任何提示?

c++ namespaces anonymous unnamed-namespace

6
推荐指数
2
解决办法
373
查看次数