sizeof
関数名への適用は制約違反であり、適合するコンパイラからの診断が必要です。gcc はデフォルトでは準拠していませんが、次のような適切なコマンドライン オプションを使用して (ほぼ) 準拠することができます。
gcc -std=c99 -pedantic
(または必要c99
に応じて置き換えます)。c90
c11
void*
gcc には、関数ポインター上でのポインター演算を許可する拡張機能があります。(このような拡張は ISO 標準で許可されていますが、準拠するコンパイラは制約違反を診断する必要があります。) たとえば、関数ポインタに 1 を追加すると、1 バイト進みます。
残念ながら、私見ですが、gcc 開発者は、関数とvoid
型のサイズを 1 にすることでこれを行うことを選択しました。ポインター演算の動作はそれに従いますが、関数または void 式のサイズを計算しようとするという欠点があります。拒否されません。
標準 C は、関数のサイズを決定する方法を提供しません。そのような概念についても議論していません。私の知る限り、gcc はそのための拡張機能を提供していません。sizeof func
関数のコード サイズに関連するものではなく、架空の値 1 が生成されます。
関数ポインタのサイズはいつでも決定できます。通常は 4 バイトまたは 8 バイトですが、もちろんそれは関数自体のサイズではありません。sizeof
そして、関数名に適用することによってそれを行うことはできません。
C プログラムが関数のサイズ (おそらくそれを実装するコードのサイズ) を取得できた場合、その情報を表示する以外に、その情報を使ってできることは何も思い浮かびません。それが探している情報である場合は、アセンブリ リストまたはオブジェクト ファイルを調べることができます。たとえば、Unix ライクなシステムでは、 の出力はnm foo.o
各関数のアドレスを示します。通常、各関数のコードのサイズがわかります (おそらく最後の関数を除く)。これはすべて非常にシステム固有です。