C++ 如何快速获取一个变量是哪个命名空间里面的?

有时候使用了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

不过以上的使用范围十分有限啊。。

命名空间会嵌套,还有类会嵌套。

待补充。

发布了140 篇原创文章 · 获赞 6 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/LU_ZHAO/article/details/104861832