关于namespace中的奇怪错误

  记录一下写代码中遇到的关于namspace奇怪的错误,找到了错误原因成功编译链接,但是不知道为什么,有大佬可以解答吗?

a.h文件

// a.h

namespace t1{

namespace t2{

extern __thread int a = 0;
void func();

inline int func2(){
    if(a == 0){
        func();    
    }
    return a;
}

} // namespace t2

} // namespace t1

a.cpp文件

// a.cpp
#include "c.h"

// using namespace t1;

namespace t1{

namespace t2{

__thread int a = 0;

void func(){
    if(a == 0){
        a = 1;
    }
}

} // namespace t2

} // namespace t1

b.h

// b.h
#include "a.h"
namespace t1{

class A{
public:
    bool check() { t2::func2() == 1; }
};

} // namespace t1

c.h

namespace t1{

class B{
public:    
};

} // namespace t1

main.cpp

// main.cpp
#include "b.h"
#include "c.h"
#include <stdio.h>

using namespace t1;

int main(){
    B b;
    A aa;
    if(aa.check()){
        printf("a is 1");
    }
    else{
        printf("a is 0");
    }

    return 0;
}

上面这个代码可以成功编译运行,但是如果把a.cpp文件中使用using namespace t1;

// a.cpp
#include "c.h"

using namespace t1;

// namespace t1{

namespace t2{

__thread int a = 0;

void func(){
    if(a == 0){
        a = 1;
    }
}

} // namespace t2

// } // namespace t1

然后就会报错,说main函数调用check函数,然后调用func2函数,然后找不到func函数和a的定义,报的是link error,属于undefine reference。

实验是在Ubuntu上使用g++编译的,有大佬知道为什么吗??

------------------------------------------------------------------------------------------------------------------

回来补个坑,进步找到问题了,

对于main.cpp,编译得到的.o文件符号表如下(通过nm .o文件就能查看重定位文件的符号表)

对于编译失败的情况,a.cpp文件得到的a.o文件符号表是

 也就是展开namespace t1,编译的得到的符号表并不包含namespace。

而编译成功的情况符号表如下

符号的名命包括namespace t2,符号的名称可以和main.o的符号表对应因此能链接成功。

所以问题应该出在namespace对编译的影响。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值