[218] Re:C言語ポインタ完全制覇についての質問
投稿者:本多
2007/02/20 02:13:25
宣言した関数が宣言のあるブロック内でのみ有効と明示したいんでしょうね。
でも、C言語を使っていると型はコンパイル後に情報が残らないので、
同じ名前が二つ残ったら、リンクエラーになるんですね。
宣言を関数ブロックに入れるというのが、かなり異常な使い方だと思いますが。
実際、以下の様になってると宣言は何の効果も発揮しません。
----test1.c----
#include <stdio.h>
static int hoge(void)
{
printf("static int hoge()\n");
return 0;
}
int main(void)
{
extern int hoge(void);
hoge();
return 0;
}
----test2.c----
#include <stdio.h>
int hoge(void)
{
printf("extern int hoge()\n");
return 0;
}
----
% gcc -O2 -Wall test1.c test2.c
% a.out
static int hoge()
まぁ、コンパイラがリンク処理を行う段階でexternなんていう情報は
すっかり消えうせて関数名だけ残ってしまう。
しかも、名前の一致する呼び出し元と実体をリンク処理しちゃう。
だから処理内容を考えると当たり前の結果なんでしょうけど。
宣言で自分の結合先を選べるという意図があったとして、結果がこうなったら、
私の例はstaticを使ってるのでちょっと事情は異なりますが
ちょっと残念に思うかもしれませんね。