4

私はこのCコードを理解しようとしているだけです(プログラムによって機能的な目標を達成しようとしているわけではありません)。これは gcc を使用してコンパイルされます。このメインは main(int a, char *argv[] ) 形式ですか? 引数と関数本体の間で何かを宣言することは許されますか (ここでは char *a; に似ています)?

#include <stdio.h>
main(u,_,a)
  char
  *a;
{
  //printf("%s\n",_,a);//just to help debugging
  //printf("%d\n",u); //just to help debugging
}
4

4 に答える 4

4

引数リストと関数本体の間の宣言は、いわゆる K&R C (C の最初のバージョン) の一部でした。はい、コンパイラが K&R コードをコンパイルできる場合、それらは有効です。

main()2つ以上の引数を持つことについて...はい、実際、 main は最大3つの引数を持つことができます:

int main (int argc, char *argv[], char *envp[]);

3 番目の引数は文字列へのポインターの配列であり、それぞれに環境変数の定義 (形式の文字列name=value)が含まれています。

于 2013-12-19T23:53:50.623 に答える
4

これは、古くて時代遅れの C 関数の書き方です。

C の祖先言語には型がなく、すべての変数に機械語が含まれていました。したがって、関数定義は次のように始まります。

main(u, _, a) {
    /* ... some code ... */
}

以前の Cは、 C に関する独創的な本の著者 (Brian Kernighan と Dennis Ritchie) から「K&R C」として知られており、変数宣言のような形式で型を追加し、関数パラメーターのリストと関数のコード。

int main(u, _, a)
    int u;
    int _;
    char *a;
{
    /* ... some code ... */
}

K&R C では、型がintの場合、多くの場所で省略できます。関数パラメーターの場合、型宣言行を完全に省略できます。

int main(u, _, a)
    char *a;
{
    /* ... some code ... */
}

ANSI Cは 1989 年に標準化され、その主な革新の 1 つは関数プロトタイプでした。適切な ANSI C では、使用前にすべての関数を宣言し、すべての引数の型を宣言します。

int main(int u, int _, char *a)
{
    /* ... some code ... */
}

C コンパイラは、レガシー コードの古い形式を引き続きサポートします。(1989 年の C 標準に準拠している場合は、準拠する必要があります。) 20 年以上経過したレガシー コードはほとんど残っていないため、そのようなコードはほとんど見つかりません。

(これは の適切なタイプではないことに注意してmainください。Gcc はそれについて警告すると思いますが、警告設定を上げる必要があるかもしれません。)

于 2013-12-19T23:58:25.590 に答える
3

これは、難読化を除いて誰も使用していない古い宣言です (トリグラフも参照してください!)。新しい C 標準では違法だと思いますが、gcc は下位互換性のためにまだサポートしています。

それが機能する方法は、型が関数の下にリストされ、戻り値の型が省略されていることです。戻り値の型がないということは、デフォルトで になることを意味しintます。典型的な main 関数は次のように書くことができます:

main(argc, argv)
    int argc;
    char** argv;
{
    printf("%d\n", argc);
    return 0;
}

左中括弧の前に他の変数を宣言することはできません。追加int c;してみると、次のエラーが発生します。

test.c:4: error: declaration for parameter ‘c’ but no such parameter
于 2013-12-19T23:53:49.377 に答える
-1

これはmain宣言の無効な形式です。これは C99 / C11 では無効ですが、C90 でも無効です。(C90 での関数の有効な宣言については、5.1.2.2.1 を参照してくださいmain)。

于 2013-12-19T23:50:13.030 に答える