记录一下写代码中遇到的关于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对编译的影响。