Chr*_*_vr 8 c++ one-definition-rule
静态变量具有文件范围.说我有两个以下文件:
我已static int Var1在两个头文件中声明了静态变量.双方file1.h并file2.h都包含在main.cpp文件中.
我这样做是因为静态变量将具有文件范围,因此它不会相互冲突.但在编译后我发现它显示出冲突.
现在静态变量的行为就像一个extern变量.另一方面,如果我在两个.cpp文件中声明静态变量,它编译得很好.
我无法理解这种行为.
任何机构都可以解释范围和链接在这种情况下的工作方式.
NPE*_*NPE 16
静态变量是编译单元的本地变量.编译单元基本上是一个.cpp文件,其中.h插入的文件内容代替每个#include指令.
现在,在编译单元中,您不能拥有两个具有相同名称的全局变量.这就是你的情况:main.cppinclude file1.h和file.h,并且两个头中的每一个都定义了它自己的Var1.
如果逻辑上这些是两个不同的变量,请为它们指定不同的名称(或将它们放在不同的名称空间中).
如果这些是相同的变量,将其移动到一个单独的头文件,var1.h和包括var1.h来自两个file1.h和file2.h,不要忘记的#include后卫在var1.h.
静态变量具有转换单元范围(通常是文件.c或.cpp文件),但是#include指令只是逐字复制文件的文本,而不创建另一个转换单元.预处理后,这个:
#include "file1.h"
#include "file2.h"
Run Code Online (Sandbox Code Playgroud)
将变成这样:
/* file1.h contents */
static int Var1;
/* file2.h contents */
static int Var1;
Run Code Online (Sandbox Code Playgroud)
如你所知,这是无效的.