0

パラメーターが計算されるときに関数を実行する古い厄介な方法があることに気付きましたが、それが何と呼ばれているのかわからないため、ルールを検索できません。

char dstr[20];
printf("a dynamic string %s\n", (prep_dstr(dstr),dstr));

アイデアは、「()」が prep_dstr 関数を実行した後にアドレス dstr を返すというものです。

私はそれが醜いことを知っており、以前はラインでそれを行うことができました-しかし、それは複雑です...

#

わかりました-それをしないようにという嘆願への答えです。

私は実際にいくつかの既存のコードでMISRAクリーンアップを行っています(私のものではありません)、現在、「prep_dstr」関数はバッファを取り(バッファの長さに関係なく)それを変更し、渡されたポインタを返しますパラメータ。

私は小さな一歩を踏み出すのが好きです-テストしてから、別の小さな一歩を踏み出します。

したがって、永続性についての手がかりなしでポインターを返すよりも少し厄介なアプローチは、ポインターを返す関数を停止し、コンマ演算子を使用することです (バッファーの末尾から外れないように確認した後)。

これでMISRAエラーのカウントダウンが始まります。すべてがまだ機能し、MISRAエラーがなくなったら、エレガンスに近づこうとします-おそらく再来年:)

4

3 に答える 3

2

コンマ演算子には適切な優先順位があり、さらにシーケンス ポイントが与えられます。つまり、プログラムの実行フローで以前のすべての副作用が解決されるポイントを定義します。したがって、関数が stringに対して行うことは
何でも、カンマ演算子に到達する前に完全に実行されます。 prep_dstr()dstr

一方、コンマ演算子は、値が最も右側のオペランドである式を提供します。

次の例では、必要に応じて valuedstrを指定します。

   5+3, prep_dstr(dstr), sqrt(25.0), dstr;
   a+b-c, NULL, dstr;
   (prep_dstr(dstr), dstr);

もちろん、このような式は string が必要な場所ならどこでも使用できますdstr

したがって、質問で使用した構文は、完全に機能します。

構文を自由に使用できるので、使用できる別の可能性があります。
関数が関数であることを考慮するとprintf()、特に式です。
このようにして、コンマ式に入れることができます。

  prep_dstr(dstr), printf("Show me the string: %s\n", dstr);

誰もが「こんな風にコードを書くな…」と言っているようです。
プログラミングスタイルにおけるこの種の宗教的アドバイスは過大評価されています。
何かをする必要がある場合は、それを実行してください。

C の原則の 1 つは、「プログラマーが行ったことを行うことを妨げてはならない」というものです。

ただし、何をするにしても、読み取り可能なコードを書くようにしてください。

于 2014-08-27T10:10:47.407 に答える
1

はい、使用する構文は目的に合わせて機能します。

ただし、きれいで読みやすいコードを書くことを検討してください。例えば、

char buffer[20];

char *destination = prepare_destination_string(buffer);

printf("a dynamic string %s\n", destination);

すべてに明確な名前を付けて理解することができ、意図した動作を簡単に推測できます。必要に応じて特定の部分を省略destinationしたり、より簡単なエラー チェックを実行したりすることもできます。

于 2014-08-27T09:41:32.297 に答える
0

あなたのインクリングとコードはどちらも正しいです。そうは言っても、これをしないでください。独自prep_dstrの線を引くことで、何がいつ起こるかについての推論がはるかに容易になります。

あなたが考えているのはコンマ演算子です。コンマがまだ別の意味を持っていないコンテキスト (関数の引数を区切るなど) では、式a, bは の値を持ちますが、最初bに評価されます。aコード内の余分な括弧により、コンマが関数の引数区切りとしてではなく、このように解釈されます。

于 2014-08-27T09:45:58.730 に答える