4

私は C で非破壊的な変換ルーチンを作成中ですが、(少なくとも Visual C++ では) 関数が逆の順序で解決されることに気付きました。

そう:

main()
{
char* psString[] = { "Hello", "World", "World2", "World3" };

printf("%s - %s - %s - %s\n", 
    H2A_N(psString[0]), 
    H2A_N(psString[1]), 
    H2A_N(psString[2]), 
    H2A_0(psString[3]));

return 1;  
};

私のコードは再入可能ではなく、単一のスレッドでのみ実行されるため、文字の静的配列を使用して結果を保存するつもりでした。

私の計画は、出力をバッファーの先頭に書き込み、H2A_N への後続の呼び出しのために次のアドレスを残す関数 H2A_0 を持つことでした。

このアプローチにはいくつかの欠点があることは認識していますが、この変換ルーチンを多くの既存のコードに適用する必要があるため、単純であるほど良いです (メモリの解放を台無しにしたくありません)。

私の質問は:

  1. 関数を(引数として他の関数に渡されるときに)逆の順序で解決するのは、C標準の一部ですか。
  2. これを行うより良い方法はありますか?
4

3 に答える 3

1

関数を逆の順序で解決するのは C 標準の一部ですか (関数が引数として他の関数に渡される場合)。

関数の引数は式として評価されます。そのため、のように実装定義x = f() + g()です。がコンパイラからコンパイラに依存するf()前に呼び出される場合は、シーケンス ポイントをチェックしてください。g()

一部のコンパイラは、iccこれに関する警告を与えることができます:

リマーク #981: オペランドは指定されていない順序で評価されます

于 2013-06-01T21:53:01.997 に答える