2

MIPSコンパイラを使用してSGIシステムから移植しているコードがいくつかあります。ダブルリターンタイプとして宣言されている関数があります。関数が正しいdoubleを見つけられない場合、それらの関数は「NULL」を返します

Intel Cコンパイラはこれを好みませんが、コードを変更せずにコンパイルできるように、この「機能」を有効にするコンパイラオプションがあるかどうかを確認しようとしていました。マニュアルページを確認しましたが、見つからないようです。

ありがとう

現在存在し、MIPSで正常に動作するコードの例

 double some_function(int param){
     double test = 26.25;
 if(param == 10){
    return test;
 }
 return (NULL);
 }

Intelコンパイラが文句を言います:エラー:戻り値の型が関数の型と一致しません

4

6 に答える 6

3

コンパイラオプションを介して、「NaN」(数値ではない)機能がある場合があります。しかし、それでもnullにはなりません。

于 2010-05-27T16:47:50.570 に答える
2

あなたのコメントに基づいて:

チェックしたところ、呼び出し関数はそれを有効な double であるかのように使用します (if ステートメント内)。

return 0;代わりに関数を変更するだけですreturn NULL;

于 2010-05-27T17:04:50.877 に答える
1

これはコンパイラオプションではありませんが#define NULL 0、(理論的には)目的の効果を得ることができます。

于 2010-05-27T16:51:06.087 に答える
1

彼らがポインタをdoubleに戻さないのは確かですか?ゼロはdoubleの有効な値であるため、NULLdoubleは無意味です。

于 2010-05-27T16:54:11.447 に答える
0

NULL関数から返されたときに特別な意味を持つとは限りません。関数が正常に完了しなかったことを示す場合、一般的な手法は、通常の状況では決して返されない値を返すことです。通常、これは無効な値を返すことを意味します。関数がポインターを返す場合、ポインターはユーザーが関数が返すことを期待する値ではないNULLため、エラーを通知する戻り値として使用されることがよくあります。NULL

定数NULLはポインターのコンテキストでのみ意味を持ち、スカラー値を返すため、コンパイラーはNULL. を返す代わりにNULL、有効な戻り値にならない値を見つけて、それをエラー インジケーターとして使用します。何をしているのかをより明確にするために#define AN_ERROR_OCCURED <<someval>>、「マジックナンバー」の使用を避けるために、定数を使用してその値をエイリアスします。

これを行う別の一般的な方法は、errnoグローバルを使用することです ( errno.h を参照)。関数でエラーが発生した場合は、errno戻る前にゼロ以外の値に設定してください。関数を呼び出すコードは、 のようなものを使用してエラーをチェックして処理できますif (errno) {...}

さらに別の方法は、関数が成功した場合はゼロを返し、それ以外の場合はゼロ以外のエラー コードを返すようにすることです。ユーザーが関数からデータを取得する必要がある場合は、追加の「リターン バッファー」ポインターを関数に渡す必要があります。

于 2010-05-27T17:11:34.433 に答える
0

コンパイラ フラグに #ifdef INTEL を使用し、そのコンパイル時オプションのリターンを 0 として定義すると思います。ちょっと面倒ですが、これが一番良い方法のようです。

于 2010-05-27T17:12:44.613 に答える