dポイントプレゼントキャンペーン実施中!

最近C言語を勉強し始めた者です。

main関数について分からないことがあるので質問致します。main関数は自作関数ですよね。ということは自由に引数を決めていいのですか?つまり
int main(int argc , char *argv[])
以外の引数を決めることは出来るのでしょうか。

A 回答 (8件)

普通の解説書では、「C言語のプログラムは main() から実行が始まる」と書かれています。

が、これが厳密には間違いです。

実際には、(No.6 の方が書かれているフリースタンディングで*ない*環境でも)、引数の処理をして、必要なメモリ割り当てをして、その後で、「規定の形の」main() を呼び出します。

つまり、裏では、

本当のスタート()
{
// いろいろな準備
main(); // main() 関数の呼び出し
}

という雰囲気のものが動いています。
このため、ここで規定されている形以外の main() を呼ぶと、余りよくないことが起こります。

あと、「共有の拡張」として、

int main(int argc, char *argv[], char *envp[]);
を受け入れる処理系もあります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

とてもよく分かりました。main関数自体がはじめから決まったプログラムに呼び出されているので、main関数の「main」という名前や戻り値が変えられないのですね。

お礼日時:2006/03/24 13:05

JISX3010


プログラム言語C
Information technology - Programming languages - C
http://www.jisc.go.jp/app/pager?id=31196
から
5.1.2.2.1 プログラム開始処理
の部分を見て下さい。
1.. int main(void)
2.. int main(int argc , char *argv[])
3.. 2と等価な記述例えばint main(int argc, char ** argv)
4.. 以上以外の処理系定義の方法(例えば、環境変数を渡すとか、void main(void) )
となっています。
名前は、変えることができますが、main 自体初期化プログラムから呼び出されるものなので、ユーザが自由に引数を決めることはできません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

自分はC言語の入門書しか持っていないので時々分からなくなることがあります。厳密なことを知りたい時はこういう本を読んでみます。

お礼日時:2006/03/24 13:08

組み込みの話をはじめると、かなりややこしくなってくるのですが...



組み込みプログラム(家電製品とか、自動車とかのハードと一体になって動くプログラム)の場合、多くはフリースタンディング環境に属します。フリースタンディング環境というのは、OSの支援なしでプログラムが動作する環境なのですが、μITRONなどではOSがあってもフリースタンディング環境に分類されます。

フリースタンディング環境では、C言語のプログラムがどんな関数から始まるかは、関数名、引数の型と個数、返却値型のすべてが処理系定義です。

一方で、例え組み込みでも、組み込みLinuxなどを使用している場合には、フリースタンディング環境ではなく、PC等と同じホスト環境になります。この場合は、必ずmainで始まります。

要は、質問者さんが「組み込み」とか「マイコン」とかいわれる分野で仕事をされているのか、そうでないのかによって、回答も変わってくるわけです。
というわけで、どちらなのでしょうか?

この回答への補足

すいません、説明不足でした。

趣味でやっているだけなので一般的なOSで働くようなプログラムの話です。

補足日時:2006/03/24 12:54
    • good
    • 0

確かに「自作関数」ですが「自作」して良いのは「入口と出口を除く、関数の中身だけ」です。



ですので、仕様通りの決められた引数(実行環境によって異なる場合がある)を受け取り、仕様通りの決められた返り値(実行環境によって異なる場合がある)を返さなければなりません。

「実行環境によって異なる」と言うのは、例えば
・組み込み系OSの場合、実行プログラムに対して「コマンドライン」とか「パラメータ」を渡さないので、main関数への引数がないか、あっても内容が常に固定
・第3引数に「環境変数」への文字列配列を渡して来る処理系がある
・組み込み系OSなど返り値が不要な処理系や、返り値がintではなくshort型やlong型など他の型を要求している処理系がある
などです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

なるほど、やはり形式は限定されているのですね。

お礼日時:2006/03/24 12:53

int func(int);


int main(int argc, char *argv)
{ func(0); return 0;}
int func(char *pc)
{ return 0; }


上のプログラムをコンパイル(実行)してみてください。
mainの引数を変えたときもこれと同じようになると思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

すいません、ちょっと意味がよく分かりません。説明してもらえるとありがたいのですが。

お礼日時:2006/03/24 12:49

通常は出来ません。


argv[]を通じて任意の個数のパラメータを渡すことも可能なので、これ以外の引数の必要もありません。

組み込み系の場合は何でもありですが、その場合はスタートアップルーチンから何から全部自分で用意することになります。

スタートアップルーチンが分からない人は手を出さないほうがいいでしょう。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

とりあえず今のうちは形式に従ってやれば問題なさそうです。

お礼日時:2006/03/24 12:42

>main関数は自作関数ですよね。


根拠は?何をもって『自作』?

>int main(int argc , char *argv[])
>以外の引数を決めることは出来るのでしょうか。
引数はvoidでも可。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>根拠は?何をもって『自作』?
えっとこれは、関数というのはライブラリに定義されている関数と自分で作る関数があると聞きました。それで、main関数は後者の形式を取っているので自作関数だと判断したということです。

ということは、main関数はライブラリ関数でもなければ、自作関数でもない特殊な関数だと理解すればいいですか?

お礼日時:2006/03/24 12:38

引数の名前は自由につけることができますが、型や個数はそうはいきません。



移植性のあるmain関数の書き方は、

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

のいずれか、またはそれらと等価なものに限られます。それ以外は処理系定義ですので、マニュアルを読むなどしてください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

main関数はやはりその二つの形式しか出来ないのですか。分かりました。

お礼日時:2006/03/24 12:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!