2016-12-06 6 views
2

私はCの関数を書くことが優れているスタイル混乱しています:C - 結果を関数に返すか、引数ポインタが指し示す変数に保存する必要がありますか?

int function() 
{ 
    /*code block*/ 
    return result; 
} 

または

個人的に
void function(int *result) 
{ 
    /*code block*/ 
} 

、私は最初のものは、明確に(とJavaスタイルのような)であると思いますが、私はCのいくつかの関数がgets(),shmget()のように2番目のスタイルとして宣言されていて、アルゴリズムコースの教師がcreate_Queue(Queue *q)のような2番目のスタイルの宣言を書いてくれると助言しています。私はそれに従うべきです。

+0

あなたの質問は、このサイトに基づいてあまりにも多くの意見です。ちょうど注意してください:考慮すべき他のものがあります。 'queue_create'がオブジェクトを割り当てると、私は個人的にオブジェクトを返す方が良いと思います(図のように、オブジェクトへのポインタでオブジェクトを返すことはできません)。さもなければ、よい設計のために考慮する他の事がある。戻り値が「自然」である場合は、それが好ましいはずです。 'fgets'のためには機能しません(**決して**使用することはありません!先生があなたに使用するように言ったら、Cを学ぶべきです)。 – Olaf

+3

それは文脈によってまったく異なります。どちらも他のものより優れていません。 –

+0

最初のものは 'result = function();'のような直接指定に使うことができ、もう1つは 'function'を呼び出す前に' result'を宣言して定義する必要があります。 JavaとCを比較しないでください。それらは、異なる利点と欠点を持つ2つの異なる世界から来ています。 –

答えて

5

最初のスタイルは、intのような小さなタイプのために最適です、doubleなど

目はstructsのように、intより大きい戻り値に意味があります。

これは、次のような利点があります。

  • 結果構造体は、発信者の裁量で、スタックまたはヒープ上のいずれかに生きることができます。
  • 呼び出し元が結果構造体の割り当ておよび解放を担当していることが明らかなので、所有権の問題はありません。
  • 構造体は、必要な構造体よりも長くても、大きな構造体に埋め込まれていても構いません。
3

これは主にスタイルの問題であり、したがってかなり主観的です。いずれのフォームも大文字と小文字を区別して使用します。

ただし、void function (int *result)の形式には、エラーコードの戻り値を予約できるという利点があります。 APIのすべての関数が同じ種類のエラータイプを返すようにライブラリを作成するのは、カスタムプラクティスです。

エラーコードの戻り値を予約することは、呼び出し元が関数の結果に関心がなければ、(void) function(x);と入力することで無視できます。

1

単純にintを返す関数などの単純なケースでは、最初のスタイルははるかに明確で簡単です。

たとえば、関数から返された複数の値を取得する場合など、2番目のスタイルが望ましい場合があります。 C標準では、関数は1つの値しか返さないため、2番目の値を返すために、関数が更新できる関数へのポインタを渡すことができます。続いてこれを説明するための仮想的な例です。

char *getline(FILE *f, int *size); 

はファイルから行を表す文字列を返す関数getlineを考えると、それはラインを読んでいるので、あなたは、ラインの長さを知ってほしいしなければなりませんそして、それを得るためには、関数を指すintへのポインタを渡します。このポインタは、行を読み込んだ後に更新されます。この場合、関数getlineがファイルから文字をスキャンするというハードワークを行っているので、これはパフォーマンスの観点からも優れているので、行のサイズを返すこともできます。それ以外の場合は、文字列を戻した後、同じタスクを繰り返すstrlen()を自分で呼び出す必要があります。この小さなトリックは、パフォーマンスクリティカルなコードに多くのCPU命令を保存するのに役立ちます。

関連する問題