0

zero.c:

    int sq();

one.c:

    int sq(int i) { return i*i; }

2.c:

    int sq(int i, int j);

main.c:

    int main() {
        printf("%d\n",sq());
        printf("%d\n",sq(2));
        printf("%d\n",sq(2,3));
    }

次に、各ファイルを個別にコンパイルし、gcc zero.o one.o two.o main.o -o main

./main与える

1
4
4

これがどのようにうまく機能するのか、少し混乱しています。sq()or sq(2)orを呼び出すと実際に何が起こるかsq(2,3)

4

4 に答える 4

0

そのため、投稿で読んだ内容に基づいて、以前に回答を書きました。それは間違っていました。これが正しい答えです。

zero.c はコードを生成しません。two.c はコードを生成しません。

main.c と one.c は、実際にコードを生成する唯一のファイルです。

one.c で引数を 1 つ指定して関数を引数sq(int i)なしで呼び出すことは、未定義の動作です (そのため、場合によっては予想に似たものを含め、「何かが起こる可能性があります」)。2 つの引数での呼び出しも未定義の動作です。繰り返しますが、これを行ったときに必ずしも「うまくいかない」とは限りませんが、動作する (または期待どおりに動作する) ことは保証されていません。たとえば、9 を返すこともあります。引数を最後のレジスターから最初のレジスターに入れます。

于 2013-05-13T16:08:34.367 に答える