加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 单定义规则强制单个静态函数变量被创建吗?

发布时间:2020-12-16 06:01:51 所属栏目:百科 来源:网络整理
导读:例如,考虑这个标题: #include iostreamtemplatebool = truestruct A { A() { static int x; std::cout x "n"; }};static A a; 如果我有两个不同的C文件,包括这个文件怎么办 – 它会打印相同的地址两次,保证?更重要的是,如果x是一个不同类型的对象,它有一
例如,考虑这个标题:
#include <iostream>

template<bool = true>
struct A {
    A() {
        static int x;
        std::cout << &x << "n";
    }
};

static A<> a;

如果我有两个不同的C文件,包括这个文件怎么办 – 它会打印相同的地址两次,保证?更重要的是,如果x是一个不同类型的对象,它有一个非平凡的构造函数,那么它是否只能被运行一次?

解决方法

标准[C 11 14.8 / 2]说

Each function template specialization instantiated from a template has its own copy of any static variable.

我假设(并真诚地希望)模板类的成员函数以相同的方式处理,尽管我找不到这样说的特定语言.

在任何情况下,除了在多线程上下文中初始化静态变量的通常风险外,我相信这将是正常的. A< true> :: A()(和内部的“static int A< true> :: A :: x”)将被标记为弱符号,并且在链接时将选择一个版本,与任何其他模板相同. (显然,A< false>的实例化将不同于A< true>).

编辑评论:

关于不同翻译单位的担心似乎由[3.2 / 5]部分所述,定义了ODR:

If D is a template and is defined in more than one translation unit,then… [providing the definitions are identical]… the program shall behave as if there were a single definition of D.

实际的要求是更多的语言 – 律师(在实例化的依赖名称必须相同等),但我认为这是有点让你清楚:-)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读