VC 两个文件包涵同一个头文件 提示变量重定义

总共四个文件。分别是定义main函数的text.cpp
定义了一个类 的 a.cpp和a.h
还有一个b.h

text.cpp代码

#include "a.h" 
#include "b.h"

int main()
{
    //some code
}

a.h代码

#pragma once

class Ca
{
    //some code
};

a.cpp代码

 #include "a.h"
#include "b.h"
    //some code

b.h代码

 #pragma once

#include "a.h"

Ca cc;
    //some code

编译链接出错

 1>正在编译...
1>text.cpp
1>a.cpp
1>正在生成代码...
1>正在链接...
1>a.obj : error LNK2005: "class Ca cc" (?cc@@3VCa@@A) 已经在 text.obj 中定义
1>F:\工程\Visual Studio 2008\Projects\gf\Debug\gf.exe : fatal error LNK1169: 找到一个或多个多重定义的符号

text.cpp,include后加

 Ca cc;

在b.h中,

 Ca cc;

改为

 extern Ca cc;

全局变量应该定义在cpp中,放头文件h中,就会要么多个包含,要么没有包含。都达不到你的要求。
在其他cpp中要引用全局变量就用extern修饰符,表示它是在其它地方定义的,这里只是引用它。

一般的规则,变量定义放在 .cpp 中,如:Ca cc;类型的声明放在 .h 中,如 Ca 的定义。

在b.h中,extern Ca cc;

看来大家讨论的很欢,没错,头文件的所有变量建议加上extern 属性