代码之家  ›  专栏  ›  技术社区  ›  Itamar Katz

h文件中的静态关键字与内部链接

  •  14
  • Itamar Katz  · 技术社区  · 14 年前

    又一个 static 问题。 我读过以下内容:

    我仍然无法理解以下行为: 我有一个 h 文件:

    // StaticTest.h
    #include <stdio.h>
    
    static int counter = 0;
    
    struct A {
        A () {
            counter++;
            printf("In A's ctor(%d)\n", counter);
        }
        ~A () {
            counter--;
            printf("In A's dtor(%d)\n", counter);
        }
    };
    
    static A a;
    

    还有两个 cpp 文件夹:

    // StaticTest1.cpp
    #include "StaticTest.h"
    
    int main () {
     return 0;
    }
    

    以及:

    // StaticTest2.cpp
    #include "StaticTest.h"
    

    程序的输出是:

    In A's ctor(1)
    In A's ctor(2)
    In A's dtor(1)
    In A's dtor(0)
    

    现在, A 的构造函数被调用两次,因为 小时 文件包含两次,并且 一个 的实例名为 a 被宣布 静止的 ,它有内部链接,编译器很高兴。 自从 counter 也被声明为静态的,它也有内部链接,我希望它的值不会在两个中共享 cpp公司 但是程序输出意味着这个值是共享的,因为它最多可以计数2。

    有什么见解吗?

    编辑: 关于在 小时 与。 cpp公司 文件也受到欢迎。

    1 回复  |  直到 7 年前
        1
  •  11
  •   CB Bailey    14 年前

    如果 StaticTest.h 在不同的源文件之间共享,则会得到未定义的行为。

    如果您用不同的转换单位定义一个类或内联函数,那么它们的定义必须是相同的(相同的标记序列),并且,关键的是,任何标识符都必须引用相同的实体(除非 const 对象与内部链接)如在另一个翻译单元中的定义。

    你违反这个规定是因为 counter 具有内部链接,因此在不同的转换单元中,函数定义中的标识符引用不同的对象。

    参考文献:C++ 03 3.2 [基本.DEF.ODR] / 5。

    推荐文章