0

戻り値に関して:

func()
{
  while(1)
  {
    /* do stuff here */
    if(error1) exit(0);
    if(error2) break;
  }       
  /* no return statement anywhere in func() */
}

しかし、呼び出し元は func() の戻りコードをチェックします

if(func()) {/* error handling */}

func()の戻り値がデフォルトでは何も設定されておらず、ジャンクであることを誰かが確認してくれるとよいでしょう。そして、これはこれらすべてに当てはまります。

  • void func()
  • int func()、 return ステートメントがまったくない、またはプレーンなreturn;.
  • func()、未指定の戻り値の型。これは、デフォルトで int を返すことを理解しています。

ありがとう..

4

3 に答える 3

3

注:この回答はC89(およびそれ以前のバージョン)に適用されます。

void func() 値を返さない関数を指定します。この場合if (func())、コンパイルエラーが発生するはずです。

int func()func()は同等であり、整数値を返します。returnステートメントによって値が提供されない場合、結果は未定義であり、警告レベルが十分に高い場合、コンパイラーは警告を発行します。実際には、ほとんどのコンパイラは、戻り値に使用されるレジスタまたはメモリ位置にあるものをすべて返すコードを生成します。

于 2012-12-13T12:30:04.940 に答える
2

関数の戻り値は、通常、プロセッサの最初のレジスタによって返されます。たとえば、x86ベースのプロセッサの場合はEAX、ARMベースのプロセッサの場合はr0です。これはコンパイラ固有ですが、多かれ少なかれ標準です。

たとえばreturn 10;、Cでは次のように翻訳されます

mov eax 10 ; pseudo code
ret        ; pseudo code

x86ベースのプロセッサのアセンブリ。

&戻り値をチェックしながら、eaxレジスタをチェックするだけです。そのレジスタに含まれているものはすべて、呼び出し元によって戻り値と見なされます。

SO ...値なし(simple return;)またはvoid関数の場合、アセンブリのステートメントの直前にEAXに含まれている値はすべてret、呼び出し元によって戻り値として扱われます。

ARMベースプロセッサの場合は、上記の回答に置き換えてくださいEAXr0:-)

私はこの事実を以下の関数のハックとして使用しました;-)

void* getStackTop(){
   asm("mov eax esp");
}

CからASMへの変換中にどのように正確に機能するかを確認するには、次のような簡単なコードを記述します。

int testfn(int unused){
   int unused2=unused; // Check how input is passed
   return 10;          // Check how output is returned
}

&それをでコンパイルしgcc -Sます。(または、アセンブリのみを生成するフラグを使用したコンパイラを使用します。)


float/struct値をどのように返すかわかりません。おそらくそれは構造体へのポインタを返し、返された構造体全体が内部でmemcpyされ、asmに変換されます。誰かが修正するかもしれません:-)

于 2012-12-13T12:28:23.087 に答える
0

C99標準以降、有効なCコードで投稿したコード。

C90 標準を実装する廃止されたコンパイラを使用している場合、それはコンパイルされ、デフォルトの型は int になります。C90 標準を引用することはできませんが、そのような関数から return ステートメントを省略すると、未定義の動作になると思います。

于 2012-12-13T12:32:50.237 に答える