スレッド: [cppll:8646] クラスの名前を引っ張ってくるには
スレッド
- 8646: 今書いているプログラムなんですが、基底クラスに、 virtual RWCString getClassName() const; というのが Osamu Shigematsu
- └8647: ちっす。 __PRETTY_FUNCTION__をお試しくださいな。(^^ class A { public: void foo() { std::cout << __PRETTY_FUNCTION_ Shin'ya MORINO
- └8651: さくっと試したら、期待の動作になりました。 が...、 http://www.cqpub.co.jp/interface/column/freesoft/2003/ Osamu Shigematsu
- ├8654: やりぃ。 実は、おもいっきし、環境依存対処法でした。失礼。 g++的には、 __FUNCTION__ = __func__ Shin'ya MORINO
- ├8655: class A { public: void foo() { std::cout << typeid(this).name() << "::" << __func__ << std::endl; } 森野慎也 mailto:smorino@ Shin'ya MORINO
- │└8659: 幸いにして、RTTI は使えるので、(当然?) を試したんですが、これだと、 P1A::foo Osamu Shigematsu
- │ ├8660: 高橋(k)です。 TAKAHASHI, kohske kohske‐at‐msc.biglobe.ne.jp TAKAHASHI, Kohske
- │ └8661: type_info::name() は処理系が勝手に決めた文字列を 返せばいいんだそうな。 だから "教えない" と FUKUDA Fumiki
- │ └8662: 文句をゆーのは、堪忍して、あ・げ・る。 だーけーど、許してあげないんだわさー。 >> g++君 Shin'ya MORINO
- │ └8672: g++君は、教えてくれました。 typeid().name()が、返すのは、マングリングされた名前ですよねー。 Shin'ya MORINO
- │ └8677: extern "C" char *__cxa_demangle (const char *__mangled_name, char *__output_buffer, __SIZE_TYPE__ *__length, int *__status); と Osamu Shigematsu
- │ ├8678: mangling の C++ での意味としては「引数の型情報を関数名に付加する」 名古屋大学大学院 情報科 Takao Ono
- │ ├8683: こんばんやっ。(^^ ソース、見てないんですが、単に、__output_bufferの値を、そのまま返して Shin'ya MORINO
- │ └8684: さーらーに、こんばんやっ。 そーなんでしょーかね。切り刻む、とか。 実際、文字列が切り刻 Shin'ya MORINO
- │ └8685: 《誤記・誤植などで》<引用・テキストなどを>だいなしにする 《へたな発音で》<ことばを>わか boochang
- └8666: C++ネタとは関係ないかもしれませんが…。 C99には「__func__」という前定義識別名というのがで seraphy
- ├8667: 盲目的に C 言語の規格に追従することはないでしょうけど, それなりに 名古屋大学大学院 情報 Takao Ono
- └8671: ちーっす。 Bjarne Stroustrup御大のC/C++ Users Journal記事が、やはり、CとC++のいと こ関係について、 Shin'ya MORINO
[cppll:8646] クラスの名前を引っ張ってくるには
- Subject:
- [cppll:8646] クラスの名前を引っ張ってくるには
- From:
- Osamu Shigematsu <m5issige@...>
- Date:
- Thu, 08 May 2003 09:25:19 +0900
- X-Mailer:
- Becky! ver. 2.05.11
- Message-Id:
- <20030508091615.9754.M5ISSIGE‐at‐mr.hitachi-medical.co.jp>
こんにちは。重松です。
今書いているプログラムなんですが、基底クラスに、
virtual RWCString getClassName() const;
というのがあって、クラスの名前を引っ張ったり、
実行時のログをとるために、
void
Hoge::doSomeStuff()
{
TRACE("Hoge::doSomeStuff");
// ゴニョゴニョ
}
みたない事をしないといけないんですけど、
いちいち書くのもかったるので何とかしたいのです。
で、TRACE() のところは、TRACE(__func__) と書けば、よさげかしら、
と思ったら、クラスの名前は返してくれないみたいです。
なにか、便利な技はないものでしょうか。
とりあえず、gcc 3.2 20020927 (prerelease), cygwin で試しました。
--
Osamu Shigematsu <m5issige@...>
今書いているプログラムなんですが、基底クラスに、
virtual RWCString getClassName() const;
というのがあって、クラスの名前を引っ張ったり、
実行時のログをとるために、
void
Hoge::doSomeStuff()
{
TRACE("Hoge::doSomeStuff");
// ゴニョゴニョ
}
みたない事をしないといけないんですけど、
いちいち書くのもかったるので何とかしたいのです。
で、TRACE() のところは、TRACE(__func__) と書けば、よさげかしら、
と思ったら、クラスの名前は返してくれないみたいです。
なにか、便利な技はないものでしょうか。
とりあえず、gcc 3.2 20020927 (prerelease), cygwin で試しました。
--
Osamu Shigematsu <m5issige@...>
[cppll:8647] Re: クラスの名前を引っ張ってくるには
- Subject:
- [cppll:8647] Re: クラスの名前を引っ張ってくるには
- From:
- Shin'ya MORINO <smorino@...>
- Date:
- Thu, 08 May 2003 09:45:02 +0900
- Message-Id:
- <3eb9a7c1.107%smorino‐at‐datamark.co.jp>
- In-Reply-To:
- 8646
- References:
- 8646
森野です。
Osamu Shigematsuさんの<20030508091615.9754.M5ISSIGE@mr.hitachi-medical.co.jp>から
>こんにちは。重松です。
ちっす。
>で、TRACE() のところは、TRACE(__func__) と書けば、よさげかしら、
>と思ったら、クラスの名前は返してくれないみたいです。
>なにか、便利な技はないものでしょうか。
__PRETTY_FUNCTION__をお試しくださいな。(^^
pretty_func.cpp-----------------------------------
#include <iostream>
class A {
public:
void foo() {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
int main() {
A().foo();
return 0;
}
---------------------------------------------------
実行結果(RH9 g++-3.2.2)----------------------------
$ g++ pretty_func.cpp -o pretty_func
$ ./pretty_func
void A::foo()
$
---------------------------------------------------
-------
森野慎也 mailto:smorino@...
Osamu Shigematsuさんの<20030508091615.9754.M5ISSIGE@mr.hitachi-medical.co.jp>から
>こんにちは。重松です。
ちっす。
>で、TRACE() のところは、TRACE(__func__) と書けば、よさげかしら、
>と思ったら、クラスの名前は返してくれないみたいです。
>なにか、便利な技はないものでしょうか。
__PRETTY_FUNCTION__をお試しくださいな。(^^
pretty_func.cpp-----------------------------------
#include <iostream>
class A {
public:
void foo() {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
int main() {
A().foo();
return 0;
}
---------------------------------------------------
実行結果(RH9 g++-3.2.2)----------------------------
$ g++ pretty_func.cpp -o pretty_func
$ ./pretty_func
void A::foo()
$
---------------------------------------------------
-------
森野慎也 mailto:smorino@...
[cppll:8651] Re: クラスの名前を引っ張ってくるには
- Subject:
- [cppll:8651] Re: クラスの名前を引っ張ってくるには
- From:
- Osamu Shigematsu <m5issige@...>
- Date:
- Thu, 08 May 2003 10:04:12 +0900
- X-Mailer:
- Becky! ver. 2.05.11
- Message-Id:
- <20030508095420.975E.M5ISSIGE‐at‐mr.hitachi-medical.co.jp>
- In-Reply-To:
- 8647
- References:
- 8646 8647
重松です。森野さん、こんにちは。コメントどうもありがとうございます。
さくっと試したら、期待の動作になりました。
が...、
http://www.cqpub.co.jp/interface/column/freesoft/2003/200304/0.htm
をよみと、思いっきり、GCC の「拡張機能」となっちゃってます。
__func__ は一応、C99 なので、他のものでも使えると思われるんですが、
(今はだめだとしても、そう遠くない将来には。。。)
この __FUNCTION__, __PRETTY_FUNCTION__ あたりは、
どの程度サポートされているのでしょうか?
一応、Sun の CC も使っている (というか、そっちがメイン) なので。
--
Osamu Shigematsu <m5issige@...>
さくっと試したら、期待の動作になりました。
が...、
http://www.cqpub.co.jp/interface/column/freesoft/2003/200304/0.htm
をよみと、思いっきり、GCC の「拡張機能」となっちゃってます。
__func__ は一応、C99 なので、他のものでも使えると思われるんですが、
(今はだめだとしても、そう遠くない将来には。。。)
この __FUNCTION__, __PRETTY_FUNCTION__ あたりは、
どの程度サポートされているのでしょうか?
一応、Sun の CC も使っている (というか、そっちがメイン) なので。
--
Osamu Shigematsu <m5issige@...>
[cppll:8654] Re: クラスの名前を引っ張ってくるには
- Subject:
- [cppll:8654] Re: クラスの名前を引っ張ってくるには
- From:
- Shin'ya MORINO <smorino@...>
- Date:
- Thu, 08 May 2003 10:38:23 +0900
- Message-Id:
- <3eb9adb5.110%smorino‐at‐datamark.co.jp>
- In-Reply-To:
- 8651
- References:
- 8646 8647 8651
森野です。
Osamu Shigematsuさんの<20030508095420.975E.M5ISSIGE@mr.hitachi-medical.co.jp>から
>さくっと試したら、期待の動作になりました。
やりぃ。
>http://www.cqpub.co.jp/interface/column/freesoft/2003/200304/0.htm
>をよみと、思いっきり、GCC の「拡張機能」となっちゃってます。
.........(^^;;
実は、おもいっきし、環境依存対処法でした。失礼。
>この __FUNCTION__, __PRETTY_FUNCTION__ あたりは、
>どの程度サポートされているのでしょうか?
>一応、Sun の CC も使っている (というか、そっちがメイン) なので。
g++的には、
__FUNCTION__ = __func__ で、関数名のみ。
__PRETTY_FUNCTION__は、クラス名付き。
なんですね。
SunのCCは、わからないのですが、さくっと、検索かけた範囲だと、
みつからないです.....
-------
森野慎也 mailto:smorino@...
Osamu Shigematsuさんの<20030508095420.975E.M5ISSIGE@mr.hitachi-medical.co.jp>から
>さくっと試したら、期待の動作になりました。
やりぃ。
>http://www.cqpub.co.jp/interface/column/freesoft/2003/200304/0.htm
>をよみと、思いっきり、GCC の「拡張機能」となっちゃってます。
.........(^^;;
実は、おもいっきし、環境依存対処法でした。失礼。
>この __FUNCTION__, __PRETTY_FUNCTION__ あたりは、
>どの程度サポートされているのでしょうか?
>一応、Sun の CC も使っている (というか、そっちがメイン) なので。
g++的には、
__FUNCTION__ = __func__ で、関数名のみ。
__PRETTY_FUNCTION__は、クラス名付き。
なんですね。
SunのCCは、わからないのですが、さくっと、検索かけた範囲だと、
みつからないです.....
-------
森野慎也 mailto:smorino@...
[cppll:8655] Re: クラスの名前を引っ張ってくるには
- Subject:
- [cppll:8655] Re: クラスの名前を引っ張ってくるには
- From:
- Shin'ya MORINO <smorino@...>
- Date:
- Thu, 08 May 2003 10:41:32 +0900
- Message-Id:
- <3eb9b55d.112%smorino‐at‐datamark.co.jp>
- In-Reply-To:
- 8651
- References:
- 8646 8647 8651
森野です。
Osamu Shigematsuさんの<20030508095420.975E.M5ISSIGE@mr.hitachi-medical.co.jp>から
>一応、Sun の CC も使っている (というか、そっちがメイン) なので。
これでどーです?
----------------------------------------------------------------
class A {
public:
void foo() {
std::cout << typeid(this).name() << "::" << __func__ << std::endl;
}
};
----------------------------------------------------------------
staticなメンバだと、困ったりします。
# ちょい、やぼったいっすね。
-------
森野慎也 mailto:smorino@...
Osamu Shigematsuさんの<20030508095420.975E.M5ISSIGE@mr.hitachi-medical.co.jp>から
>一応、Sun の CC も使っている (というか、そっちがメイン) なので。
これでどーです?
----------------------------------------------------------------
class A {
public:
void foo() {
std::cout << typeid(this).name() << "::" << __func__ << std::endl;
}
};
----------------------------------------------------------------
staticなメンバだと、困ったりします。
# ちょい、やぼったいっすね。
-------
森野慎也 mailto:smorino@...
[cppll:8659] Re: クラスの名前を引っ張ってくるには
- Subject:
- [cppll:8659] Re: クラスの名前を引っ張ってくるには
- From:
- Osamu Shigematsu <m5issige@...>
- Date:
- Thu, 08 May 2003 12:18:36 +0900
- X-Mailer:
- Becky! ver. 2.05.11
- Message-Id:
- <20030508121652.9762.M5ISSIGE‐at‐mr.hitachi-medical.co.jp>
- In-Reply-To:
- 8655
- References:
- 8651 8655
重松です。こんにちは。
その方法なおもいつかなかった。ありがとうございます。
幸いにして、RTTI は使えるので、(当然?)
> ----------------------------------------------------------------
> class A {
> public:
> void foo() {
> std::cout << typeid(this).name() << "::" << __func__ << std::endl;
> }
> };
> ----------------------------------------------------------------
を試したんですが、これだと、
P1A::foo
になります。typeid(*this) に変えたんですが、なぜか頭に 1A という風に
1 がつくんです。なんなんだろう。。。
--
Osamu Shigematsu <m5issige@...>
その方法なおもいつかなかった。ありがとうございます。
幸いにして、RTTI は使えるので、(当然?)
> ----------------------------------------------------------------
> class A {
> public:
> void foo() {
> std::cout << typeid(this).name() << "::" << __func__ << std::endl;
> }
> };
> ----------------------------------------------------------------
を試したんですが、これだと、
P1A::foo
になります。typeid(*this) に変えたんですが、なぜか頭に 1A という風に
1 がつくんです。なんなんだろう。。。
--
Osamu Shigematsu <m5issige@...>
[cppll:8660] Re: クラスの名前を引っ張ってくるには
- Subject:
- [cppll:8660] Re: クラスの名前を引っ張ってくるには
- From:
- TAKAHASHI, Kohske <kohske@...>
- Date:
- Thu, 08 May 2003 12:25:14 +0900
- X-Mailer:
- Becky! ver. 2.05.08
- Message-Id:
- <20030508122417.DF89.KOHSKE‐at‐msc.biglobe.ne.jp>
- In-Reply-To:
- 8659
- References:
- 8655 8659
高橋(k)です。
> を試したんですが、これだと、
>
> P1A::foo
>
> になります。typeid(*this) に変えたんですが、なぜか頭に 1A という風に
> 1 がつくんです。なんなんだろう。。。
gccでは、クラス名の前にクラス名の文字数がくっつきます。
--
TAKAHASHI, kohske
kohske@...
> を試したんですが、これだと、
>
> P1A::foo
>
> になります。typeid(*this) に変えたんですが、なぜか頭に 1A という風に
> 1 がつくんです。なんなんだろう。。。
gccでは、クラス名の前にクラス名の文字数がくっつきます。
--
TAKAHASHI, kohske
kohske@...
[cppll:8661] Re: クラスの名前を引っ張ってくるには
- Subject:
- [cppll:8661] Re: クラスの名前を引っ張ってくるには
- From:
- FUKUDA Fumiki <fukuda.fm@...>
- Date:
- Thu, 08 May 2003 12:56:18 +0900
- X-Mailer:
- WeMail32[1.42] ID:NTES00
- Message-Id:
- <200305080402.h4842Id02690‐at‐mailsv.nec.co.jp>
- In-Reply-To:
- 8659
επιστημηです。
--- "[cppll:8659] Re:クラスの名前を引っ張ってくるには" / Osamu Shigematsu ---
>> std::cout << typeid(this).name() << "::" << __func__ << std::endl;
>>...
> P1A::foo
>
>になります。typeid(*this) に変えたんですが、なぜか頭に 1A という風に
>1 がつくんです。なんなんだろう。。。
type_info::name() は処理系が勝手に決めた文字列を
返せばいいんだそうな。
だから "教えない" とか "ひ・み・つ(うふ)" てプリント
されても文句言えないのです^^;
-----:-----:-----:-----:-----:-----:-----:-----:-----:-----
FUKUDA (episteme) Fumiki -- magical, but never a magic...
--- "[cppll:8659] Re:クラスの名前を引っ張ってくるには" / Osamu Shigematsu ---
>> std::cout << typeid(this).name() << "::" << __func__ << std::endl;
>>...
> P1A::foo
>
>になります。typeid(*this) に変えたんですが、なぜか頭に 1A という風に
>1 がつくんです。なんなんだろう。。。
type_info::name() は処理系が勝手に決めた文字列を
返せばいいんだそうな。
だから "教えない" とか "ひ・み・つ(うふ)" てプリント
されても文句言えないのです^^;
-----:-----:-----:-----:-----:-----:-----:-----:-----:-----
FUKUDA (episteme) Fumiki -- magical, but never a magic...
[cppll:8662] Re: クラスの名前を引っ張ってくるには
- Subject:
- [cppll:8662] Re: クラスの名前を引っ張ってくるには
- From:
- Shin'ya MORINO <smorino@...>
- Date:
- Thu, 08 May 2003 13:15:19 +0900
- Message-Id:
- <3eb9d901.115%smorino‐at‐datamark.co.jp>
- In-Reply-To:
- 8661
- References:
- 8659 8661
森野です。
FUKUDA Fumikiさんの<200305080402.h4842Id02690@mailsv.nec.co.jp>から
>type_info::name() は処理系が勝手に決めた文字列を
>返せばいいんだそうな。
これ、変換してくれる関数、さがしてみよーとおもいつつ、幾星霜。
# c++filtあたり、ソース、たぐってみよかしらん。
>だから "教えない" とか "ひ・み・つ(うふ)" てプリント
>されても文句言えないのです^^;
文句をゆーのは、堪忍して、あ・げ・る。
だーけーど、許してあげないんだわさー。 >> g++君
-------
森野慎也 mailto:smorino@...
FUKUDA Fumikiさんの<200305080402.h4842Id02690@mailsv.nec.co.jp>から
>type_info::name() は処理系が勝手に決めた文字列を
>返せばいいんだそうな。
これ、変換してくれる関数、さがしてみよーとおもいつつ、幾星霜。
# c++filtあたり、ソース、たぐってみよかしらん。
>だから "教えない" とか "ひ・み・つ(うふ)" てプリント
>されても文句言えないのです^^;
文句をゆーのは、堪忍して、あ・げ・る。
だーけーど、許してあげないんだわさー。 >> g++君
-------
森野慎也 mailto:smorino@...
[cppll:8672] Re: クラスの名前を引っ張ってくるには
- Subject:
- [cppll:8672] Re: クラスの名前を引っ張ってくるには
- From:
- Shin'ya MORINO <smorino@...>
- Date:
- Fri, 09 May 2003 13:37:03 +0900
- Message-Id:
- <3ebb2715.132%smorino‐at‐datamark.co.jp>
- In-Reply-To:
- 8662
- References:
- 8659 8661 8662
森野です。
# 環境依存ネタでもーしわけないです。
Shin'ya MORINOさんの<3eb9d901.115%smorino@datamark.co.jp>から
>>だから "教えない" とか "ひ・み・つ(うふ)" てプリント
>>されても文句言えないのです^^;
g++君は、教えてくれました。
typeid().name()が、返すのは、マングリングされた名前ですよねー。
デマングリング用の関数、ソースから探してみたところ、ありました。
demangle.cpp------------------------------------------------
#include <iostream>
extern "C" char *__cxa_demangle (const char *mangled_name,
char *output_buffer,
size_t *length,
int *status);
int main() {
const char* mangled_name="P1A";// mangled name for A*.
char output_buffer[256];
size_t length = 256;
int status = 0;
std::cout << __cxa_demangle(mangled_name, output_buffer, &length, &status) << std::endl;
return 0;
}
------------------------------------------------------------
$ g++ demangle.cpp -o demangle
$ ./demangle
A*
$
だそうです。
この関数、実体は、libgcc.aに入っています。
引数は、きちんと見てません。
より、詳細に知りたい方は、binutils(私が使ったのは、binutils-2.12.1)のソースを
引っ張ってきて、その中の、cp-demangle.cというファイル、覗いたげてくださいな。
多分、g++-3系列用。同じようなところに、gcc-2.96で使えるのも、ありそうです。
-------
森野慎也 mailto:smorino@...
# 環境依存ネタでもーしわけないです。
Shin'ya MORINOさんの<3eb9d901.115%smorino@datamark.co.jp>から
>>だから "教えない" とか "ひ・み・つ(うふ)" てプリント
>>されても文句言えないのです^^;
g++君は、教えてくれました。
typeid().name()が、返すのは、マングリングされた名前ですよねー。
デマングリング用の関数、ソースから探してみたところ、ありました。
demangle.cpp------------------------------------------------
#include <iostream>
extern "C" char *__cxa_demangle (const char *mangled_name,
char *output_buffer,
size_t *length,
int *status);
int main() {
const char* mangled_name="P1A";// mangled name for A*.
char output_buffer[256];
size_t length = 256;
int status = 0;
std::cout << __cxa_demangle(mangled_name, output_buffer, &length, &status) << std::endl;
return 0;
}
------------------------------------------------------------
$ g++ demangle.cpp -o demangle
$ ./demangle
A*
$
だそうです。
この関数、実体は、libgcc.aに入っています。
引数は、きちんと見てません。
より、詳細に知りたい方は、binutils(私が使ったのは、binutils-2.12.1)のソースを
引っ張ってきて、その中の、cp-demangle.cというファイル、覗いたげてくださいな。
多分、g++-3系列用。同じようなところに、gcc-2.96で使えるのも、ありそうです。
-------
森野慎也 mailto:smorino@...
[cppll:8677] Re: クラスの名前を引っ張ってくるには
- Subject:
- [cppll:8677] Re: クラスの名前を引っ張ってくるには
- From:
- Osamu Shigematsu <m5issige@...>
- Date:
- Fri, 09 May 2003 17:03:44 +0900
- X-Mailer:
- Becky! ver. 2.05.11
- Message-Id:
- <20030509165439.8707.M5ISSIGE‐at‐mr.hitachi-medical.co.jp>
- In-Reply-To:
- 8672
- References:
- 8662 8672
重松です。こんにちは。
/usr/include 以下を demangle で grep したところ、
/usr/include/c++/3.2/cxxabi.h に同じような定義がありました。
環境は、cygwin です。
(504 行目から引用)
/* demangling routines */
extern "C"
char *__cxa_demangle (const char *__mangled_name,
char *__output_buffer,
__SIZE_TYPE__ *__length,
int *__status);
# size_t と __SIZE_TYPE__ 以外は同じみたいです。
# けど、戻り値が const char * でなくていいのだろうか。
ところで、mangle/demangle っていったいどういうことなんでしょうか?
英和辞書を引いたら、頓珍漢な訳語が出てきたのですが、
個人的なイメージでは、mangle が普通の関数名だとかのシンボルを
計算機 (あるいはコンパイラ) が便利なシンボルに変換すること、
demangle は、その逆の処理で、gcc の場合は、
P1A ... 計算機的に都合の良いシンボル
A* .... 人間的に普通のシンボル
ということなのかなぁと。
こんなレベルだから、demangling routine なんて、思いつかなかったです。
--
Osamu Shigematsu <m5issige@...>
/usr/include 以下を demangle で grep したところ、
/usr/include/c++/3.2/cxxabi.h に同じような定義がありました。
環境は、cygwin です。
(504 行目から引用)
/* demangling routines */
extern "C"
char *__cxa_demangle (const char *__mangled_name,
char *__output_buffer,
__SIZE_TYPE__ *__length,
int *__status);
# size_t と __SIZE_TYPE__ 以外は同じみたいです。
# けど、戻り値が const char * でなくていいのだろうか。
ところで、mangle/demangle っていったいどういうことなんでしょうか?
英和辞書を引いたら、頓珍漢な訳語が出てきたのですが、
個人的なイメージでは、mangle が普通の関数名だとかのシンボルを
計算機 (あるいはコンパイラ) が便利なシンボルに変換すること、
demangle は、その逆の処理で、gcc の場合は、
P1A ... 計算機的に都合の良いシンボル
A* .... 人間的に普通のシンボル
ということなのかなぁと。
こんなレベルだから、demangling routine なんて、思いつかなかったです。
--
Osamu Shigematsu <m5issige@...>
[cppll:8678] Re: クラスの名前を引っ張ってくるには
小野@名古屋大学 です.
<20030509165439.8707.M5ISSIGE@mr.hitachi-medical.co.jp>の記事において
m5issige@...さんは書きました。
m5issige> ところで、mangle/demangle っていったいどういうことなんでしょうか?
mangling の C++ での意味としては「引数の型情報を関数名に付加する」
くらいかな?
# samba だと「name mangling」を「名前の短縮」って訳してるなぁ.
--
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男
P.S.
む, mangling に「自転車, ちゃりんこ」って意味もあるのか (オースト
ラリアの俗語だけど).
<20030509165439.8707.M5ISSIGE@mr.hitachi-medical.co.jp>の記事において
m5issige@...さんは書きました。
m5issige> ところで、mangle/demangle っていったいどういうことなんでしょうか?
mangling の C++ での意味としては「引数の型情報を関数名に付加する」
くらいかな?
# samba だと「name mangling」を「名前の短縮」って訳してるなぁ.
--
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男
P.S.
む, mangling に「自転車, ちゃりんこ」って意味もあるのか (オースト
ラリアの俗語だけど).
[cppll:8683] Re: クラスの名前を引っ張ってくるには
- Subject:
- [cppll:8683] Re: クラスの名前を引っ張ってくるには
- From:
- Shin'ya MORINO <smorino@...>
- Date:
- Sat, 10 May 2003 01:00:30 +0900
- X-Mailer:
- Datula version 1.51.09 for Windows
- Message-Id:
- <3ebbd077.895%smorino‐at‐d1.dion.ne.jp>
- In-Reply-To:
- 8677
- References:
- 8662 8672 8677
森野です。
Osamu Shigematsuさんの<20030509165439.8707.M5ISSIGE@mr.hitachi-medical.co.jp>から
>重松です。こんにちは。
こんばんやっ。(^^
>extern "C"
>char *__cxa_demangle (const char *__mangled_name,
> char *__output_buffer,
> __SIZE_TYPE__ *__length,
> int *__status);
>
># size_t と __SIZE_TYPE__ 以外は同じみたいです。
># けど、戻り値が const char * でなくていいのだろうか。
ソース、見てないんですが、単に、__output_bufferの値を、そのまま返して
いるはず。
# それよか、これ、クラス名なんかのトークンしか、扱えないみたいです。
# ごめんっ。これじゃ足りないっ。(;_;
--
Shin'ya MORINO mailto:smorino@...
Osamu Shigematsuさんの<20030509165439.8707.M5ISSIGE@mr.hitachi-medical.co.jp>から
>重松です。こんにちは。
こんばんやっ。(^^
>extern "C"
>char *__cxa_demangle (const char *__mangled_name,
> char *__output_buffer,
> __SIZE_TYPE__ *__length,
> int *__status);
>
># size_t と __SIZE_TYPE__ 以外は同じみたいです。
># けど、戻り値が const char * でなくていいのだろうか。
ソース、見てないんですが、単に、__output_bufferの値を、そのまま返して
いるはず。
# それよか、これ、クラス名なんかのトークンしか、扱えないみたいです。
# ごめんっ。これじゃ足りないっ。(;_;
--
Shin'ya MORINO mailto:smorino@...
[cppll:8684] Re: クラスの名前を引っ張ってくるには
- Subject:
- [cppll:8684] Re: クラスの名前を引っ張ってくるには
- From:
- Shin'ya MORINO <smorino@...>
- Date:
- Sat, 10 May 2003 01:29:48 +0900
- X-Mailer:
- Datula version 1.51.09 for Windows
- Message-Id:
- <3ebbd0b2.896%smorino‐at‐d1.dion.ne.jp>
- In-Reply-To:
- 8677
- References:
- 8662 8672 8677
森野です。
Osamu Shigematsuさんの<20030509165439.8707.M5ISSIGE@mr.hitachi-medical.co.jp>から
>重松です。こんにちは。
さーらーに、こんばんやっ。
>ところで、mangle/demangle っていったいどういうことなんでしょうか?
過去ログ、ご参照くださいませ。
# http://www.tietew.jp/cppll/archive/2268
>英和辞書を引いたら、頓珍漢な訳語が出てきたのですが、
そーなんでしょーかね。切り刻む、とか。
実際、文字列が切り刻まれてるみたい。 # ってほんとー?
>個人的なイメージでは、mangle が普通の関数名だとかのシンボルを
>計算機 (あるいはコンパイラ) が便利なシンボルに変換すること、
>demangle は、その逆の処理で、gcc の場合は、
>
> P1A ... 計算機的に都合の良いシンボル
> A* .... 人間的に普通のシンボル
>
>ということなのかなぁと。
C++は、なるべく、Cのインフラストラクチャーを利用できるよう、設計された
と、どこかで読んだです。
# επιさんの日常本だったと思うのですが.....
# 今、みつけられません。うーん.....
とのことで、Cのリンカを流用できるように、関数のシンボルを、Cの関数とし
て扱えるようにする必要があったのかと。
で、実験。
マングリングされた名前は、Cの関数として、認識でけるはず。
ゆえに、マングリングされた名前で、C関数を宣言すれば、メソッドをC関数と
して呼び出せるはず。
g++-3.2.2とg++-2.96で、実行。(両者とも環境は、RedHat 9)
mangle.cpp---------------------------------------------------
#include <string>
#include <iostream>
struct c_type {};
class A : public c_type {
public:
A(const std::string &message) : message_(message) {}
void get_message() const;
std::string message_;
};
void A::get_message() const {
std::cout << message_ << std::endl;
}
/** A::get_message()と等価なC functionの宣言 */
/** 関数名は、A::get_message()をマングリングした名前 */
/* For g++-3.2.x */
extern "C" void _ZNK1A11get_messageEv(c_type *);
/* For g++-2.96 */
extern "C" void get_message__C1A(c_type *);
int main() {
std::cout << "メソッドをC関数で呼べるかしら。" << std::endl;
A a("はいな");
_ZNK1A11get_messageEv(&a); /* For g++-3.2.x */
// get_message__C1A(&a); /* For g++-2.96 */
return 0;
}
-------------------------------------------------------------
実行結果-----------------------------------------------------
$ g++ mangle.cpp -o mangle
$ ./mangle
メソッドをC関数で呼べるかしら。
はいな。
$
-------------------------------------------------------------
やったぁ。(^^
--
Shin'ya MORINO mailto:smorino@...
Osamu Shigematsuさんの<20030509165439.8707.M5ISSIGE@mr.hitachi-medical.co.jp>から
>重松です。こんにちは。
さーらーに、こんばんやっ。
>ところで、mangle/demangle っていったいどういうことなんでしょうか?
過去ログ、ご参照くださいませ。
# http://www.tietew.jp/cppll/archive/2268
>英和辞書を引いたら、頓珍漢な訳語が出てきたのですが、
そーなんでしょーかね。切り刻む、とか。
実際、文字列が切り刻まれてるみたい。 # ってほんとー?
>個人的なイメージでは、mangle が普通の関数名だとかのシンボルを
>計算機 (あるいはコンパイラ) が便利なシンボルに変換すること、
>demangle は、その逆の処理で、gcc の場合は、
>
> P1A ... 計算機的に都合の良いシンボル
> A* .... 人間的に普通のシンボル
>
>ということなのかなぁと。
C++は、なるべく、Cのインフラストラクチャーを利用できるよう、設計された
と、どこかで読んだです。
# επιさんの日常本だったと思うのですが.....
# 今、みつけられません。うーん.....
とのことで、Cのリンカを流用できるように、関数のシンボルを、Cの関数とし
て扱えるようにする必要があったのかと。
で、実験。
マングリングされた名前は、Cの関数として、認識でけるはず。
ゆえに、マングリングされた名前で、C関数を宣言すれば、メソッドをC関数と
して呼び出せるはず。
g++-3.2.2とg++-2.96で、実行。(両者とも環境は、RedHat 9)
mangle.cpp---------------------------------------------------
#include <string>
#include <iostream>
struct c_type {};
class A : public c_type {
public:
A(const std::string &message) : message_(message) {}
void get_message() const;
std::string message_;
};
void A::get_message() const {
std::cout << message_ << std::endl;
}
/** A::get_message()と等価なC functionの宣言 */
/** 関数名は、A::get_message()をマングリングした名前 */
/* For g++-3.2.x */
extern "C" void _ZNK1A11get_messageEv(c_type *);
/* For g++-2.96 */
extern "C" void get_message__C1A(c_type *);
int main() {
std::cout << "メソッドをC関数で呼べるかしら。" << std::endl;
A a("はいな");
_ZNK1A11get_messageEv(&a); /* For g++-3.2.x */
// get_message__C1A(&a); /* For g++-2.96 */
return 0;
}
-------------------------------------------------------------
実行結果-----------------------------------------------------
$ g++ mangle.cpp -o mangle
$ ./mangle
メソッドをC関数で呼べるかしら。
はいな。
$
-------------------------------------------------------------
やったぁ。(^^
--
Shin'ya MORINO mailto:smorino@...
[cppll:8685] Re: クラスの名前を引っ張ってくるには
ぶーちゃんです。
From: "Shin'ya MORINO" <smorino@...>
Subject: [cppll:8684] Re: クラスの名前を引っ張ってくるには
Date: Sat, 10 May 2003 01:29:48 +0900
Message-ID: <3ebbd0b2.896%smorino@d1.dion.ne.jp>
> 森野です。
>
> Osamu Shigematsuさんの<20030509165439.8707.M5ISSIGE@mr.hitachi-medical.co.jp>から
> >重松です。こんにちは。
> さーらーに、こんばんやっ。
>
> >ところで、mangle/demangle っていったいどういうことなんでしょうか?
> 過去ログ、ご参照くださいませ。
> # http://www.tietew.jp/cppll/archive/2268
>
> >英和辞書を引いたら、頓珍漢な訳語が出てきたのですが、
> そーなんでしょーかね。切り刻む、とか。
> 実際、文字列が切り刻まれてるみたい。 # ってほんとー?
こんな訳もあるみたいです。(Readers 英和辞典より)
《誤記・誤植などで》〈引用・テキストなどを〉だいなしにする
《へたな発音で》〈ことばを〉わからなくする.
> C++は、なるべく、Cのインフラストラクチャーを利用できるよう、設計された
> と、どこかで読んだです。
> # επιさんの日常本だったと思うのですが.....
> # 今、みつけられません。うーん.....
第 2 章「C++ の歴史のお話」にありますね。
> とのことで、Cのリンカを流用できるように、関数のシンボルを、Cの関数とし
> て扱えるようにする必要があったのかと。
私が C++ を始めた環境では、コンパイラは C++ に対応していたものの、リン
カ、デバッガは C のものでした。ですので、人間 demangling は必須状態で
した。(その頃の一般的環境がどうだったかは知りませんが)
# そんなに沢山オーバーロードする訳でないので厳密でなくても良かったのが
# 救いでした。
## でも数ヶ月でたまりかねてリンカ、デバッガを差し替えました。
From: "Shin'ya MORINO" <smorino@...>
Subject: [cppll:8684] Re: クラスの名前を引っ張ってくるには
Date: Sat, 10 May 2003 01:29:48 +0900
Message-ID: <3ebbd0b2.896%smorino@d1.dion.ne.jp>
> 森野です。
>
> Osamu Shigematsuさんの<20030509165439.8707.M5ISSIGE@mr.hitachi-medical.co.jp>から
> >重松です。こんにちは。
> さーらーに、こんばんやっ。
>
> >ところで、mangle/demangle っていったいどういうことなんでしょうか?
> 過去ログ、ご参照くださいませ。
> # http://www.tietew.jp/cppll/archive/2268
>
> >英和辞書を引いたら、頓珍漢な訳語が出てきたのですが、
> そーなんでしょーかね。切り刻む、とか。
> 実際、文字列が切り刻まれてるみたい。 # ってほんとー?
こんな訳もあるみたいです。(Readers 英和辞典より)
《誤記・誤植などで》〈引用・テキストなどを〉だいなしにする
《へたな発音で》〈ことばを〉わからなくする.
> C++は、なるべく、Cのインフラストラクチャーを利用できるよう、設計された
> と、どこかで読んだです。
> # επιさんの日常本だったと思うのですが.....
> # 今、みつけられません。うーん.....
第 2 章「C++ の歴史のお話」にありますね。
> とのことで、Cのリンカを流用できるように、関数のシンボルを、Cの関数とし
> て扱えるようにする必要があったのかと。
私が C++ を始めた環境では、コンパイラは C++ に対応していたものの、リン
カ、デバッガは C のものでした。ですので、人間 demangling は必須状態で
した。(その頃の一般的環境がどうだったかは知りませんが)
# そんなに沢山オーバーロードする訳でないので厳密でなくても良かったのが
# 救いでした。
## でも数ヶ月でたまりかねてリンカ、デバッガを差し替えました。
[cppll:8666] Re: クラスの名前を引っ張ってくるには
seraphyです。
C++ネタとは関係ないかもしれませんが…。
C99には「__func__」という前定義識別名というのができたらしいです。
ちょいと前にネットの海を流されていたら漂着したところが、そんなことを書いて
ました。
http://seclan.dll.jp/c99d/c99d07.htm#dt19990516
で、C++の重要なコンセプトの1つとしてC言語の互換性を維持することにあり、そ
のためにわざわざ他の言語と比較して洗練された言語体系を捨てざるを得なかったわ
けですが、このようにC言語自体の規格がアップグレードした場合には、当然、C++も
追従するんでしょうかね?
それとも、もはやC++とCは分離し互換性のない道を歩み始めるのでしょうか?
そのあたり、気になったりします。
ゴミレス失礼しました。
では。
>森野です。
> >で、TRACE() のところは、TRACE(__func__) と書けば、よさげかしら、
> >と思ったら、クラスの名前は返してくれないみたいです。
> >なにか、便利な技はないものでしょうか。
>
>__PRETTY_FUNCTION__をお試しくださいな。(^^
>
--
seraphy <seraphy@...>
C++ネタとは関係ないかもしれませんが…。
C99には「__func__」という前定義識別名というのができたらしいです。
ちょいと前にネットの海を流されていたら漂着したところが、そんなことを書いて
ました。
http://seclan.dll.jp/c99d/c99d07.htm#dt19990516
で、C++の重要なコンセプトの1つとしてC言語の互換性を維持することにあり、そ
のためにわざわざ他の言語と比較して洗練された言語体系を捨てざるを得なかったわ
けですが、このようにC言語自体の規格がアップグレードした場合には、当然、C++も
追従するんでしょうかね?
それとも、もはやC++とCは分離し互換性のない道を歩み始めるのでしょうか?
そのあたり、気になったりします。
ゴミレス失礼しました。
では。
>森野です。
> >で、TRACE() のところは、TRACE(__func__) と書けば、よさげかしら、
> >と思ったら、クラスの名前は返してくれないみたいです。
> >なにか、便利な技はないものでしょうか。
>
>__PRETTY_FUNCTION__をお試しくださいな。(^^
>
--
seraphy <seraphy@...>
[cppll:8667] Re: クラスの名前を引っ張ってくるには
小野@名古屋大学 です.
完全に憶測モード.
<20030508190249.7E29.SERAPHY@cocoa.ocn.ne.jp>の記事において
seraphy@...さんは書きました。
seraphy> で、C++の重要なコンセプトの1つとしてC言語の互換性を維持することにあり、そ
seraphy> のためにわざわざ他の言語と比較して洗練された言語体系を捨てざるを得なかったわ
seraphy> けですが、このようにC言語自体の規格がアップグレードした場合には、当然、C++も
seraphy> 追従するんでしょうかね?
seraphy> それとも、もはやC++とCは分離し互換性のない道を歩み始めるのでしょうか?
盲目的に C 言語の規格に追従することはないでしょうけど, それなりに
は考慮するんじゃないでしょうか.
--
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男
P.S.
そろそろ C++ 言語の規格改訂もあるのかな?
完全に憶測モード.
<20030508190249.7E29.SERAPHY@cocoa.ocn.ne.jp>の記事において
seraphy@...さんは書きました。
seraphy> で、C++の重要なコンセプトの1つとしてC言語の互換性を維持することにあり、そ
seraphy> のためにわざわざ他の言語と比較して洗練された言語体系を捨てざるを得なかったわ
seraphy> けですが、このようにC言語自体の規格がアップグレードした場合には、当然、C++も
seraphy> 追従するんでしょうかね?
seraphy> それとも、もはやC++とCは分離し互換性のない道を歩み始めるのでしょうか?
盲目的に C 言語の規格に追従することはないでしょうけど, それなりに
は考慮するんじゃないでしょうか.
--
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男
P.S.
そろそろ C++ 言語の規格改訂もあるのかな?
[cppll:8671] Re: クラスの名前を引っ張ってくるには
- Subject:
- [cppll:8671] Re: クラスの名前を引っ張ってくるには
- From:
- Shin'ya MORINO <smorino@...>
- Date:
- Fri, 09 May 2003 01:27:58 +0900
- X-Mailer:
- Datula version 1.51.09 for Windows
- Message-Id:
- <3eba80d7.892%smorino‐at‐d1.dion.ne.jp>
- In-Reply-To:
- 8666
- References:
- 8647 8651 8666
森野です。
seraphyさんの<20030508190249.7E29.SERAPHY@cocoa.ocn.ne.jp>から
>seraphyです。
ちーっす。
> それとも、もはやC++とCは分離し互換性のない道を歩み始めるのでしょうか?
> そのあたり、気になったりします。
Bjarne Stroustrup御大のC/C++ Users Journal記事が、やはり、CとC++のいと
こ関係について、議論してました。
http://www.cuj.com/articles/2002/0207/0207d/0207d.htm?topic=reference
書き出しの訳:
"古典的なCは、二人の後継者を生んだ。それは、ISO CとISO C++である。ここ
何年か、両者は、違うペースで、異なる方向に進化してきた。この結果、この
二つの言語は、伝統的なC言語を、少しだけ違うやりかたでサポートすること
となった。"
# なーんか、わくわくするです。富山敬のナレーション希望。(^^;;
gccでとおるコードがg++で通らなくなったのが、designated initializerで、
その際のg++のエラーメッセージは、"未実装"とのこと。
gcc拡張をg++でも使うつもりだけど未実装なのか、g++は、C99も食ってくれる
ようになるのか.......
気にしだすと、ほんとーに、気になります。(^^
--
Shin'ya MORINO mailto:smorino@...
seraphyさんの<20030508190249.7E29.SERAPHY@cocoa.ocn.ne.jp>から
>seraphyです。
ちーっす。
> それとも、もはやC++とCは分離し互換性のない道を歩み始めるのでしょうか?
> そのあたり、気になったりします。
Bjarne Stroustrup御大のC/C++ Users Journal記事が、やはり、CとC++のいと
こ関係について、議論してました。
http://www.cuj.com/articles/2002/0207/0207d/0207d.htm?topic=reference
書き出しの訳:
"古典的なCは、二人の後継者を生んだ。それは、ISO CとISO C++である。ここ
何年か、両者は、違うペースで、異なる方向に進化してきた。この結果、この
二つの言語は、伝統的なC言語を、少しだけ違うやりかたでサポートすること
となった。"
# なーんか、わくわくするです。富山敬のナレーション希望。(^^;;
gccでとおるコードがg++で通らなくなったのが、designated initializerで、
その際のg++のエラーメッセージは、"未実装"とのこと。
gcc拡張をg++でも使うつもりだけど未実装なのか、g++は、C99も食ってくれる
ようになるのか.......
気にしだすと、ほんとーに、気になります。(^^
--
Shin'ya MORINO mailto:smorino@...