2017-11-28 8 views
3

これはかなり簡単な質問ですが、私はそれを行かせることはできません。私は最近Cで作業を始めましたが(最初はそれほど経験はありませんでした)、何が起こっているのかをよく理解することができます。もちろん、argcとargvがmain()に渡されると、引数の数と引数のベクトルをそれぞれ表すことがわかります。私が理解しようとしているのは、コンパイラがint argcをコマンドラインから渡された引数の数として解釈する方法を知っていることです。もし私がmain(つまりint testcunc(int argc、char * argv []))を真似しようとする単純な関数を書いて、文字列を渡すと、コンパイラは "期待されたint型だが引数型はchar *私が期待するように。コマンドライン引数がmain()に渡されたとき、これはどうやって解釈されますか?argcに関して(それが何を意味するのか疑問に思わない)

+0

コマンドラインが文字列として渡されず、舞台裏でかなりの魔法が発生しています –

+0

Cランタイムスタートアップコードは引数文字列(OS固有の方法で)を取ります。ピースに分割し、それらを通過させる 'main'を呼び出します。あるいは、ある種の場合(Unix-yシステム)、OS(より正確にはシェル)は文字列を解析し、それをCランタイムに分割して渡します。 –

+1

関連:http://daviddeley.com/autohotkey/parameters/parameters.htm –

答えて

4

mainは、プロセスの起動時に呼び出される最初のルーチンではありません。通常は、リンクするときにプログラムに組み込まれたCライブラリによって提供される_crt0のような特別なエントリポイントです。この特別なエントリーポイントのコードは、(何らかの方法でCの外で、特にオペレーティングシステムに)渡されたコマンドライン情報を調べ、mainの引数リストを構築します。それ以降は、mainと呼ばれます。

+0

ありがとう、これは私が知りたかったものです。 –

3

あなたが(例えば、コマンドラインから)自分でargc値を渡さない、それだけでargcため正確なコンテンツのように、お使いの環境(ランタイム)によって供給されています。 argcの値は非負でなければならない(インジケータがを採掘)

  • は、C11、章§5.1.2.2.1を、詳しく説明する[以下注]。

  • argv[argc]は、NULLポインタです。

  • argcの値がゼロより大きい場合

    、スタートアップをプログラムする前にホスト環境によって 実装定義の値が与えられた文字列へのポインタを含むものとアレイメンバーargv[0]介して argv[argc-1]含め。 の目的は、プログラムの起動に先立って決定されたプログラム情報に、ホスト環境の別の場所から を提供することです。 [Note start]ホスト環境が の文字列に大文字と小文字の両方を使用できない場合、実装 は、文字列が小文字で確実に受信されるようにしなければなりません。 [注終了]一般的なCの実装で

関連する問題