有时候使用了using namespace编译指令,使用变量的时候就不用加命名空间了,但是如果我们需要知道变量在哪个命名空间,怎么做呢?
以下使用objdump和c++filt进行还原:
/// @file main.cc
/// @author zhaolu
/// @version 1.0
/// @data 2020-03-14
#include <iostream>
#include <string>
namespace zhaolu
{
template<typename T>
class matrix final
{
public:
explicit matrix(uint32_t size):
SIZE(size)
{
_data = static_cast<T**>(malloc(SIZE * sizeof(T*)));
for (uint32_t i = 0; i < SIZE; ++i)
{
_data[i] = new T[SIZE];
}
}
inline const uint32_t size() const
{
return SIZE;
}
T* operator[](uint32_t index) const
{
return _data[index];
}
~matrix()
{
for (uint32_t i = 0; i < SIZE; ++i)
{
delete[] _data[i];
}
free(_data);
}
private:
const uint32_t SIZE;
T** _data;
};
}
using namespace std;
using namespace zhaolu;
int fun(string s,matrix<int> m)
{
return 0;
}
int main()
{
return 0;
}
文件编译生成目标文件:
:gcc -lstdc++ -std=c++11 main.cc -o main.o
然后使用objdump查看:
:objdump -t main.o
main.o: file format Mach-O 64-bit x86-64
SYMBOL TABLE:
0000000100000f90 g F __TEXT,__text __Z3funNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN6zhaolu6matrixIiEE
0000000100000000 g F __TEXT,__text __mh_execute_header
0000000100000fa0 g F __TEXT,__text _main
0000000000000000 *UND* dyld_stub_binder
看到__Z3funNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN6zhaolu6matrixIiEE就是我们需要的函数了,之所以是这样是因为编译器的命名粉碎规则,使用c++filt还原如下:
:objdump -t main.o | awk '{print $5}' | c++filt
64-bit
fun(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, zhaolu::matrix<int>)
__mh_execute_header
_main
看到
string
matrix<int>
分别还原成了:
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >
zhaolu::matrix<int>
那么C++ 如何快速获取一个函数在哪个命名空间里面呢?是一样的:
https://blog.csdn.net/LU_ZHAO/article/details/104865693
不过以上的使用范围十分有限啊。。
命名空间会嵌套,还有类会嵌套。
待补充。