天使と悪魔選手権

関数 int f();
の宣言で、

①fを関数と解釈した場合のfの型は無い。(もちろん、f()の型はintになります。)
②fを関数名と解釈した時、fの型は、int (*)()になる。

と言う理解で正しいでしょうか?
また、②の場合、関数へのポインタとなりますが、ポインタの指す中身(この場合は、関数全体になると思うのですが)の大きさを見る方法とかはあるのでしょうか?

質問者からの補足コメント

  • fを関数と解釈した場合、
    fの型はint ()でいいのでしょうか?
    ちなみに、
    sizeof(f)

    sizeof(int ())
    の使い方は許されていないようです。
    また、関数全体の大きさは、sizeof()などで調べられないけど、ポインタが指している先は、
    関数全体の先頭アドレスという理解でいいのでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/04/08 16:34

A 回答 (3件)

「f を関数と解釈する」ってどういうことだろう. 「関数」と「関数名」の区別がよくわからない.



ちなみに (2) は厳密にいうと違う. 前の質問で
int array[3];
とあるとき array の型は int [3] であり, 特定の場合を除くと int * に変換される
って書いたと思うんだけど, それと同じように
int f();
のとき f の型は int () であって特定の場合を除くと int (*)() に変換される
という仕様になっています.

そして関数全体の大きさを知るポータブルな方法は存在しません.
この回答への補足あり
    • good
    • 0

fはあくまで「関数」で、必要に応じてポインタに変換されます。


>関数全体の先頭アドレス
先頭かどうかはコンパイラの実装次第。
利用者が気にする必要はありません。
関数を起動するためのエントリーポイントです。

>ポインタの指す中身(この場合は、
>関数全体になると思うのですが)の
>大きさを見る方法とかはあるのでしょうか?

ありません。そもそも特定の関数に属さない
共通コード等も生成されるので、大きさは定義
不能だと思います。
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございます。

お礼日時:2016/04/11 20:27

「関数と解釈する」とか「関数名と解釈する」とかがどのような行為を意味しているのかわかりません. 「fを関数と解釈する」あるいは「fを関数名と解釈する」と, どのようなことが起きるのでしょうか?



あと, とりあえず手元にある C99 の規格を読む限りそもそも
ポインタが「先頭アドレス」を指すかどうか不明
って感じがする (常識的にはそうしそうだが). ざっと見た限り
オブジェクトのアドレスを char * に変換すると「先頭アドレス」になる
ことは C99 では明記されてるんだけど, &x だけで「x の先頭アドレスになる」とまでは書いてない気がする.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!