C ++中的静态全局变量和匿名名称空间


11
  1. 为什么在引入静态全局变量(内部链接)和未命名的命名空间中的符号(外部链接,无论如何都无法从外部引用它)之间进行区分?

  2. 这些原因是否仍然有效,还是有新的原因?

  3. 除了匿名全局(或命名空间范围)联合必须具有static的任意规则之外,还剩下什么地方,它们又是什么?

  4. 对于积分,如果没有充分的理由使它们有所不同,是否有要求使它们相等的要求?


当C ++引入名称空间(C ++ 98),特别是未命名的名称空间时,由于热情高涨,静态全局变量被弃用,不如新事物,尽管C ++ 11对此进行了还原
弃用static关键字…不再?

在C ++ 11之前,不能将具有内部链接的符号用作模板参数:为什么C ++ 03要求模板参数具有外部链接?


看起来您基本上已经回答了自己的问题,除了“符合要求的实现”位;也许您应该考虑删除下半部分,然后将其发布为答案?还是这里还没有答案?
凯尔·斯特兰德

@KyleStrand重新格式化了所有内容。
Deduplicator 2015年

Answers:


3

我不认为这可以回答您所有的问题(或其中的任何一个?),但是文件级静态声明和匿名名称空间之间的主要区别在于名称空间也适用于类型(您不能static在声明变量的含义相同),这就是为什么首选名称空间的原因,所以有一个习惯用语来声明文件作用域的数据和类型。

举例来说,以下代码应该可以正常编译。(因为您无法区分这两种类型,但是允许,所以它并不是真正有用的)

#include <iostream>

struct Foobar
{
    int   foo;
    float bar;
};

namespace
{

struct Foobar
{
    double baz;
};

} // namespace

int main()
{
    std::cout << "HELLO!\n";
}

现场测试


它之所以编译是因为您没有在主函数中使用Foobar。
dshil

更重要的是,如果另一个.cpp文件声明了自己的版本,会发生什么struct Foobar?更糟糕的是,假设现在class Foobar。考虑一下您打算如何为它们两者创建构造函数。
dgnuff
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.