2

次のように宣言するとします。

void foo(uint64_t);

そして、この関数は外部アセンブリ ファイルで定義されます。今、C コードから次のように呼び出します。

uint32_t x = 42;
foo(x);

xキャストされるのはuint64_tいつですか?関連するターゲットの ABI によって義務付けられている任意のレジスタ/スタックの場所でアセンブリ コードを常に受け​​取ることに依存できますかuint64_t、それとも自分でキャストを行う必要がありますか?

言い換えれば、関数定義がコンパイラで利用できない場合foo(x)foo((uint64_t)x)同等ですか? ばかげた質問かもしれませんが、ここで実際に何が起こるかわかりません。

4

3 に答える 3

1

c11 仕様 6.5.2.2-4 では:

関数の呼び出しの準備では、引数が評価され、各パラメーターに対応する引数の値が割り当てられます。

したがって、関数呼び出しのxに a にキャスト (昇格?、変換?) されます。uint64_t

于 2013-07-13T12:47:08.557 に答える
0

それ自体が昇格されるため、明示的に型キャストすることを避けることができますuint64_t

編集: @ H2CO3の答えは、このことをかなりよく説明しています。

于 2013-07-13T12:56:52.773 に答える