访问静态变量时内联函数和静态内联函数之间的差异

Hao*_* Wu 1 c++ static gcc inline

我在阅读其他代码时遇到了一个有趣的案例.

在头文件中,定义了一个静态变量和一个内联函数,简化如下:

static int ply;

inline int WTM(){return ply;}
Run Code Online (Sandbox Code Playgroud)

并在cpp包含此头的其他文件中调用该函数.

cout << ply << " " << WTM();
Run Code Online (Sandbox Code Playgroud)

奇怪的是,在调用此函数的位置,ply内联函数内部的变量与函数外部之前的相同变量具有不同的值.

输出为0 1;

我检查了所有的文件,并都plyWTM()只有这个单一的定义.

之后我将代码更改为以下内容:

static int ply;

static inline int WTM(){return ply;}
Run Code Online (Sandbox Code Playgroud)

这两个值变得相同.

我的编译器g++ (GCC) 4.4.7使用默认设置.

我搜索了这个现象并得到了这两个链接: 内联函数和静态内联函数之间的区别http://gcc.gnu.org/onlinedocs/gcc/Inline.html 但仍然不明白为什么会发生这种情况(特别是为什么他们在第一种情况下可能有不同的价值观).我想知道是否有人可以告诉我编译器将如何扩展这两段代码(我尝试使用-E但似乎没有在内联函数上工作).

Som*_*ude 5

这是因为静态变量将在包含头文件的所有翻译单元中单独定义,但(非静态)函数将仅定义一次.因此,您拥有变量的多个副本,但只有一个函数副本.该函数使用哪个变量副本?我不知道,我认为它是未定义的行为或实现定义(必须阅读规范).

声明函数时的不同之处在于static,它将在每个转换单元中定义与变量相同,因此仅访问该转换单元的变量.