场景描述:
VS2015,在同一个项目中,有a.hpp,a.cpp,b.hpp,b.cpp,main.cpp
//a.hpp代码
#pragma once
namespace A
{
int color = 5; //被调用时error LNK2005
//const int color = 5; //right,but why???
}
//b.hpp代码
#pragma once
namespace B
{
void OutputColor();
}
//b.cpp代码
#include "a.hpp"
#include "b.hpp"
#include <iostream>
void B::OutputColor()
{
std::cout << A::color << std::endl;
}
编译报错:
原因分析:
根本原因:头文件中变量进行了定义!!! 原则上,头文件只声明,不定义。
参考链接:https://blog.csdn.net/baixiaozhe/article/details/70577669
参考链接:https://stackoverflow.com/questions/10046485/error-lnk2005-already-defined
解决办法:
1. 头文件使用extern
//a.hpp代码
namespace A
{
extern int color;
}
//a.cpp代码
#include "a.hpp"
int A::color = 5;
//b.hpp代码
#pragma once
namespace B
{
void OutputColor();
}
//b.cpp代码
#include "a.hpp"
#include "b.hpp"
#include <iostream>
void B::OutputColor()
{
std::cout << A::color << std::endl;
}
2. const int color; 定义时添加const/static,编译成功............
不清楚具体原因是什么,有兴趣的小伙伴可以补充,谢谢!!!