c – h文件中的静态关键字和内部链接

前端之家收集整理的这篇文章主要介绍了c – h文件中的静态关键字和内部链接前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
又一个静态的问题.
我已阅读以下内容

> What are static variables?
> file scope and static floats
> http://msdn.microsoft.com/en-us/library/s1sb61xd.aspx

我仍然不了解以下行为:
我有一个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的构造函数调用两次,因为h文件被包含两次,并且由于A的名为a的实例被声明为静态,所以它具有内部链接,并且编译器很开心.
由于计数器也被声明为静态,它也具有内部链接,我希望它的值不会在两个cpp文件中共享 – 但是程序输出意味着该值是共享的,因为它最多可达2.

任何见解?

编辑:
在h与cpp文件中声明静态变量的背景下,关于什么被认为是“良好的编程习惯”的任何答案也是受欢迎的.

解决方法

如果StaticTest.h在不同的源文件之间共享,那么您将获得未定义的行为.

如果您在不同的翻译单元中定义类或内联函数,那么它们的定义必须相同(相同的令牌序列),并且至关重要的是,任何标识符必须引用同一个实体(除非具有内部链接的const对象)在另一个翻译单位.

您违反了这一点,因为计数器具有内部链接,因此在不同的翻译单元中,函数定义中的标识符是指不同的对象.

参考:C 03 3.2 [basic.def.odr] / 5.

猜你在找的C&C++相关文章