0

関数型の長さを見つける必要があるときは、 sizeof () を使用してそれを実行していました。

期待される結果は 4 バイトと 8 バイトですが、現在、結果は GCC 経由で 1 バイトです。

出力が 4 バイトと 8 バイトではなく 1 バイトなのはなぜですか?

#include <stdio.h>

int foo (); 
double bar (); 

int 
main (void)
{
    printf ("int foo () %lu\n", sizeof (foo));  
    printf ("double bar () %lu\n", sizeof (bar));
}

double 
bar (void)
{
    return 1.1;
}

int
foo (void)
{
    return 0;
}               
4

5 に答える 5

3

sizeof演算子は関数型では使用できません。これは、ISO/IEC C 標準で明示的に禁止されています。したがって、戻り値は意味がありません。

参照ISO/IEC 9899:201x §6.5.3.4 :

演算子は、sizeof関数型または不完全な型を持つ式、そのような型の括弧で囲まれた名前、またはビット フィールド メンバーを指定する式には適用されません。

-pedanticフラグを有効にすると警告が発生するはずだと思います。

于 2013-09-24T18:14:20.963 に答える
1

戻り値ではなく、関数自体のサイズを見つけようとしています。戻り値の型を見つけるには、次のように一対の括弧を追加して、関数呼び出し式の型が必要であることをコンパイラに伝える必要があります。

printf ("int foo () %lu\n", sizeof (foo()));  
printf ("double bar () %lu\n", sizeof (bar()));

関数は呼び出されないことに注意してください。戻り値の型の sizeof はコンパイル時に計算されます。

ideone のデモ

于 2013-09-24T18:14:21.447 に答える
0

sizeof関数名への適用は制約違反であり、適合するコンパイラからの診断が必要です。gcc はデフォルトでは準拠していませんが、次のような適切なコマンドライン オプションを使用して (ほぼ) 準拠することができます。

gcc -std=c99 -pedantic

(または必要c99に応じて置き換えます)。c90c11

void*gcc には、関数ポインター上でのポインター演算を許可する拡張機能があります。(このような拡張は ISO 標準で許可されていますが、準拠するコンパイラは制約違反を診断する必要があります。) たとえば、関数ポインタに 1 を追加すると、1 バイト進みます。

残念ながら、私見ですが、gcc 開発者は、関数とvoid型のサイズを 1 にすることでこれを行うことを選択しました。ポインター演算の動作はそれに従いますが、関数または void 式のサイズを計算しようとするという欠点があります。拒否されません。

標準 C は、関数のサイズを決定する方法を提供しません。そのような概念についても議論していません。私の知る限り、gcc はそのための拡張機能を提供していません。sizeof func関数のコード サイズに関連するものではなく、架空の値 1 が生成されます。

関数ポインタのサイズはいつでも決定できます。通常は 4 バイトまたは 8 バイトですが、もちろんそれは関数自体のサイズではありません。sizeofそして、関数名に適用することによってそれを行うことはできません。

C プログラムが関数のサイズ (おそらくそれを実装するコードのサイズ) を取得できた場合、その情報を表示する以外に、その情報を使ってできることは何も思い浮かびません。それが探している情報である場合は、アセンブリ リストまたはオブジェクト ファイルを調べることができます。たとえば、Unix ライクなシステムでは、 の出力はnm foo.o各関数のアドレスを示します。通常、各関数のコードのサイズがわかります (おそらく最後の関数を除く)。これはすべて非常にシステム固有です。

于 2013-09-24T18:32:10.500 に答える
0

sizeof は、関数型を持つ変数には適用しないでください。したがって、あなたが見ているのは基本的に未定義の動作です。理想的には、コンパイラはそれについて不平を言うべきでした..

于 2013-09-24T18:14:24.070 に答える
0

標準ではsizeof関数型を持つ式に演算子を適用してはならない」 (§6.5.3.4/1) と記載されていますが、GNU C では、これを実行した結果は明確に定義されています。

"sizeofも void および関数型で許可され、1 を返します"
~ GCC、6.23 void および関数ポインタの算術

こちらもご覧ください: Why is the size of a function in C always 1 byte?

于 2013-09-24T18:16:19.957 に答える