作者JeffHung (御风只配做笨木头)
看板Programming
标题Re: c++内如何得到物件的名称呢?
时间Sun Jul 29 10:03:08 2007
※ 引述《[email protected] (㊣"MORTAR─COMBAT─")》之铭言:
: ※ 引述《jiannrong ( )》之铭言:
: > 请教一下,这里我会产生两个物件,
: > 只是,我希望在建构子内,看到物件的名称,
: > 请问该如何做呢?
: > 我使用this,可是却显示出记忆体位址..
: 标准C++好像没有物件名称这回事吧 你要自己做进去
: 比如说 自己做一个base class叫做framework 在里面把物件名称定义好
: 然後所有的class都继承framework
: 不做就没有
: 他不像Java设计的时候就把这项也规定进去…
基本上有两个办法,不过都不 portable,也不一定有效,
您可以试试看你的环境可不可以弄出来:
1. typeid(*this).name()
typeid() 会传回对应於 object 的的 type_info 物件,
而 type_info.name() 即是取 class 名。
不过,这个「名」是 implementation-defined,
不同的 compiler 有不同的作法,跑出来的名字,
也不一定能够让人看得懂。
但如果看得懂的话,你就可以写一些程式去 parse 这个字串,
转成你真正想要储存的格式。
2. 使用 __PRETTY_FUNCTION__
GCC 有提供一个叫做 __PRETTY_FUNCTION__ 的 predefined macro,
就好像 __FILE__ 与 __LINE__ 一样,
__PRETTY_FUNCTION__ 会回传目前函式的「漂亮且完整的名称」,
稍加 parse 一下即可取出 class 名的部份。
其他 compiler,有的可能会有类似的东西存在,
不过您就得自己翻翻文件了。
在 C99 standard 里,也有个 __func__,可以回传函式的名称,如:
int show_my_name(char unused)
{
printf("%s", __func__); // 印出 show_my_name
return 0;
}
因为没有 name decoration 的问题存在,所以 C99 的 __func__
可以是 portable 的[1],各家 compiler 都必须产出 "show_my_name"。
不过,若要取 C++ 的 class 名,__func__ 就会很杂乱了。
[1] 当然,也是有尚未支援 C99 的 compiler 就是了,如 VC6。
--
我的微笑,坚持要有鼻子。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.250.103.118
※ 编辑: JeffHung 来自: 60.250.103.118 (07/29 10:05)