6

typedef int (xxx)(int yyy);xxx という名前の関数を整数パラメータで定義することを意味します。詳細については、このSO 投稿を参照してください。

私はこれをさまざまな方法で試しました。それが私のコードです:

#include<stdio.h>
#include<stdlib.h>
typedef int (xxx)(int yyy);

void f1(xxx a)
{
    printf("f1:%d\n",a);
}
void f2(xxx *a)
{
    printf("f2:%d\n",a);
}
int test(int y)
{
}
int main()
{
    xxx *a;
    f1(test);
    f1(a);
    f2(test);
    f2(a);

    xxx b;
    printf("xxx's size:%d\n", sizeof(b));
}

出力:

f1:4199274
f1:2
f2:4199274
f2:2
xxx's size:1

私の質問:

  1. f(xxx a)と同じf(xxx *a)ですか?
  2. sizeof(someFunction)定義されているかどうか
4

1 に答える 1

8

xxx という名前の関数を定義することを意味します

関数型を定義します。

f(xxx a) は f(xxx *a) と同じですか?

はい。しかし、これは言語の一種のハックです。星が欠けていたので、星が追加されました。

sizeof(someFunction) が定義されているかどうか?

特にそうではありません。アセンブリ言語で、またはプログラムがどのようにリンクされているかについての詳細な知識を使用してこれを行うことができますが、C にとって意味的な意味はありません。C はハーバード アーキテクチャ マシンをサポートしているため、関数は間接的なジャンプを超えてアドレス指定可能である必要さえありません。(また、サイズは命令の数と性質によって決まるため、同じタイプの 2 つの関数は通常、サイズが異なることに注意してください。)

C11 6.3.2.1/4 は言う

関数指定子は、関数型を持つ式です。それが sizeof 演算子のオペランドである場合を除いて、... ''型を返す関数'' 型の関数指定子は、''型を返す関数へのポインタ'' 型を持つ式に変換されます。

そして 6.5.3.4/1 は言う

sizeof 演算子は、関数型を持つ式には適用されません…</p>

コンパイラが 6.3.2.1/4 の適用に失敗しているようです。エラー メッセージが必要です。

于 2013-08-27T04:28:05.407 に答える