C++ error LNK2005: "int A::color" (?color@A@@3HA) 已经在 a.obj 中定义

场景描述:

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,编译成功............

   不清楚具体原因是什么,有兴趣的小伙伴可以补充,谢谢!!!

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值