こちらのメーリングリストに送信してもよいのか
不安だったのですが。
linux のソースを見た時に
例えば
extern void vide(void);
__asm__(".align 4\nvide: ret");
---------------------------------------
static void __cpuinit init_amd_k5(struct cpuinfo_x86 *c)
{
..........
..........
..........
---------------------------------------
などのように
先頭に __(アンダーバー 2つ)を付けているのですが
これは、何か理由があるのでしょうか?
また、
先頭に _(アンダーバー 1つだけ)の時などは
存在するのでしょうか?
--------------------------------------
Power up the Internet with Yahoo! Toolbar.
http://pr.mail.yahoo.co.jp/toolbar/
特に2つという理由はないはずで、変数/関数名の衝突を防ぐために
利用しているかと思います。(識者の方、フォローお願いします)
カーネル付属文書のCodingStyleには、名前は短いほうが良いとは
あるんですが、アンダースコアについての記載はなさそうです。
http://lxr.linux.no/linux+v2.6.28.7/Documentation/CodingStyle
ちなみにアンダースコアの数については以下のように
static inline void *____cache_alloc_node(struct kmem_cache *cachep,
gfp_t flags, int nodeid)
{
return NULL;
}
それ以上多いものもありますし、逆にひとつの関数も存在しています。
int __sched _cond_resched(void)
{
:
}
ご参考まで。
On Tue, 24 Feb 2009 19:32:53 +0900
tanaka <tanaka...@yahoo.co.jp> さん wrote:
> linux のソースを見た時に
> 例えば
> extern void vide(void);
> __asm__(".align 4\nvide: ret");
>
> ---------------------------------------
>
> static void __cpuinit init_amd_k5(struct cpuinfo_x86 *c)
> {
>
> ..........
> ..........
> ..........
>
> ---------------------------------------
>
> などのように
> 先頭に __(アンダーバー 2つ)を付けているのですが
> これは、何か理由があるのでしょうか?
>
> また、
> 先頭に _(アンダーバー 1つだけ)の時などは
> 存在するのでしょうか?
--
Tatsuo Kawasaki
kawasaki at wwing.net
(2009/02/24 19:32), tanaka さんは書きました:
> linux のソースを見た時に
> 先頭に __(アンダーバー 2つ)を付けているのですが
> これは、何か理由があるのでしょうか?
>
> また、
> 先頭に _(アンダーバー 1つだけ)の時などは
> 存在するのでしょうか?
以下はあくまで私の理解で、
さまざまな文書で読んだ内容などがベースになっていますが、
もはや個別には覚えていないので出典などはあまり提示できません。
また、多分、暗黙の了解的側面もあると思います。それを踏まえて参考までに。
# 世の中のメジャーな各種実装とおおむね整合性はとれていると思いますが。
まず一般論から。
underscore が先頭についているのは、
主にライブラリや処理系に依存する名前(関数名、予約語等)です。
ユーザ(一般の開発者)の使用する名前空間との衝突を避けるために、
一般に使われそうな英文字で始まる語の使用を避けた結果です。
本来は、ライブラリの中で使われる語は、
static 宣言するなどして外部の名前空間からは遮蔽すべきですが、
既存の予約語や標準ライブラリなどとの併用のためなどの実装上の都合で、
ヘッダファイル等の中だけで使われるような語がいくつかあります。
たとえば、既存の標準関数 abc にバグがある場合に、
_abc という仮の名前の関数を宣言して #define abc(a) _abc(a) などする例があります。
この際の _abc は本来ユーザの名前空間から見える必要はありませんが、
ヘッダファイルで宣言したマクロで使用する際は実装上必要になります。
こうした場合に使用する仮の名前がユーザがつける名前と衝突することを避けるため、
underscore で始まる名前にするわけです。
ところで、こうした環境依存の語の中には、
複数の環境で共通して使われる目的のものも存在します。
例えば __STDC__ や __STDC_VERSION__、__cplusplus などです。
underscore ひとつの名前は環境依存の語として定義されている可能性が高いので、
互いの環境での衝突を避けるために、さらに underscore を重ねているようです。
複数環境での使用が目的でなく、他ライブラリへの配慮などのケースもあるでしょう。
他にも underscore が先頭の語を使用している例もありますし、
上に書いた例と違う使い方のケースもあると思いますが、おおむね、
名前空間の衝突回避か、または環境依存であることの強調が目的のようです。
質問にたちかえって、Linux の kernel source での使い方についてですが、
まず、
> extern void vide(void);
> __asm__(".align 4\nvide: ret");
の __asm__ は GCC という処理系に依存した語ですね。
特に Linux の kernel はそれを利用しているにすぎないので、
Linux の kernel 特有の語というわけではありません。
ただ、kernel というプログラムの特質上、
アセンブリ言語での記述が随所に出てきますので、
この語が現われることも一般のプログラムよりは多いかとは思います。
次に、
> static void __cpuinit init_amd_k5(struct cpuinfo_x86 *c)
> {
ですが、こちらは Linux の kernel 内部でキーワード的に使っている語ですね。
処理系依存であることを示す目的もあるかとは思いますが、
cpuinit という語自体は関数などにつけてしまいそうな名前でもあるので、
そうした語との衝突を避ける意味合いもあるのだと思います。
Linux kernel の場合、各 source file ごとの名前空間に加えて、
kernel 本体と各 module それぞれ内部に閉じた名前空間も持っていますが、
__cpuinit は予約語的に使っている語のため、あちこちで使われることになるので、
そうしたレベルでの遮蔽では足りず、こうした配慮が必要になるのでしょう。
ちなみに、ぐぐったらこんな文書をみつけました。
http://sourceforge.jp/projects/libstdc99/docs/coding-rule/ja/2/coding-rule.html
名前の定義に関する項目の中で underscore に触れているものがいくつかありますので、
他の実例のひとつとして参考になるかと思います。
--
Takeshi Kusune <kus...@sfc.wide.ad.jp>
回答くださった皆様
ありがとうございました。
----- Original Message -----
>Date: Thu, 26 Feb 2009 02:49:08 +0900
>From: Takeshi Kusune <kus...@sfc.wide.ad.jp>
>Subject: [linux-users:108223] Re: linux
> 関数名 先頭文字 __
> について?
>To: linux...@linux.or.jp
>
>
>楠根です。
>
>(2009/02/24 19:32), tanaka さんは書きました:
>> linux のソースを見た時に
>
>> 先頭に __(アンダーバー 2つ)を付けているのですが
>> これは、何か理由があるのでしょうか?
>>
>> また、
>> 先頭に _(アンダーバー 1つだけ)の時などは
>> 存在するのでしょうか?
>
>> extern void vide(void);
>> __asm__(".align 4¥nvide: ret");
>
>の __asm__ は GCC という処理系に依存した語ですね。
>特に Linux の kernel はそれを利用しているにすぎないので、
>Linux の kernel 特有の語というわけではありません。
>
>ただ、kernel というプログラムの特質上、
>アセンブリ言語での記述が随所に出てきますので、
>この語が現われることも一般のプログラムよりは多いかとは思います。
>
>
>次に、
>
>> static void __cpuinit init_amd_k5(struct cpuinfo_x86 *c)
>> {
>