Category Archives: 9-1.ソース・ビルド・インストール

main関数の引数


アニメ『悪偶 -天才人形-』

1話で設定に引き込まれます。怪しいキャラデザとかも設定によく合ってます。2話目でいきなりバトルになって、戸惑いましたが、もう少し見てみようと思います。

あぐう、ということで、argumentやります。

Cのmain関数のargですが、こんな風に書きますよね。

takk@deb9:~/tmp$ cat t.c
#include <stdio.h>

int main(int argc, char* argv[])
{
	while(argc--)
		printf("%s\n", *argv++);

	return 0;
}
takk@deb9:~/tmp$

定型文ですね。

実行すると、

takk@deb9:~/tmp$ gcc t.c
takk@deb9:~/tmp$ ./a.out aa bb cc dd ee ff
./a.out
aa
bb
cc
dd
ee
ff
takk@deb9:~/tmp$ 

このように出力されます。

このargcやargvって、他の変数名に変えられるのでしょうか?
やってみます。

takk@deb9:~/tmp$ cat t.c
#include <stdio.h>

int main(int n, char* str[])
{
	while(n--)
		printf("%s\n", *str++);

	return 0;
}

takk@deb9:~/tmp$ gcc t.c
takk@deb9:~/tmp$ ./a.out aa bb cc dd ee ff
./a.out
aa
bb
cc
dd
ee
ff
takk@deb9:~/tmp$ 

問題なく動きました。名称変更は大丈夫なようです。

次は、引数を2つから1つだけにしてみます。ビルドできるでしょうか。

takk@deb9:~/tmp$ cat t.c
#include <stdio.h>

int main(int n)
{
	printf("%d\n", n);

	return 0;
}

takk@deb9:~/tmp$ gcc t.c
takk@deb9:~/tmp$ ./a.out aa bb cc dd ee ff
7
takk@deb9:~/tmp$ 

ビルドできて、動作もしました。行けるんですね。

では、次に、この引数一つだけのmain関数が、ANSI準拠しているかどうか、確認します。
man gccで、言語オプションの章を引用。

言語オプション
       以下のオプションは、コンパイラが受け付ける C の方言に関する制御を行な
       います:

       -ansi  全ての ANSI 標準の C プログラムをサポートします。

              このオプションは、GNU C が持つ ANSI C との非互換な機能を全て排
              除します。   例えば、asm,   inline,   typeof  などのキーワード
              や、unix や vax などの現在使用しているシステムを規定する定義済
              みマクロなどが抑制されます。  さらに、好ましくなくかつほとんど
              使用されない ANSI のトライグラフの機能を使  用可能とし、さらに
              `$' を識別子の一部として使用できないようにします。

              代替キーワードである__asm__,     __extension__,    __inline__,
              __typeof__ は、 `-ansi' が指定された場合でも使用することが可能
              です。もちろん、  これらを ANSI C プログラムで使用することが望
              ましくないのは当然ですが、`-ansi' をつけてコンパイルされる場合
              でも、インクルードされるヘッダファイル中に  これらが記述できる
              ということは有用です。 __unix__ や __vax__  などの代替定義済み
              マクロは、  `-ansi' を指定する場合でも指定しない場合でも、利用
              可能となっています。

              `-ansi' オプションは、ANSI  準拠でないプログラムを不必要に拒否
              することは  ありません。もしこのような動作を行なわせたい場合に
              は`-ansi'に加えて-pedantic'   オプションを指定する必要がありま
              す。

-ansi -pedanticを指定すれば、ANSI準拠でないプログラムを拒否してくれるってことですね。
では、先ほど作った引数1つのmain関数を、このオプションをつけてビルドしてみましょう。

takk@deb9:~/tmp$ gcc -ansi -pedantic t.c
t.c:3:5: warning: ‘main’ takes only zero or two arguments [-Wmain]
 int main(int n)
     ^~~~
takk@deb9:~/tmp$ 

warningが表示されました。どうやら、ANSI準拠ではなさそうです。

引数を2つに戻してみて、もう一度チェック。

takk@deb9:~/tmp$ cat t.c
#include <stdio.h>

int main(int n,char *str[])
{
	printf("%d\n", n);

	return 0;
}

takk@deb9:~/tmp$ gcc -ansi -pedantic t.c
takk@deb9:~/tmp$ 

今度はwarningが表示されません。引数2つタイプはOKのようです。

次は、引数なしタイプ。

takk@deb9:~/tmp$ cat t.c
#include <stdio.h>

int main()
{
	printf("Hello\n");

	return 0;
}

takk@deb9:~/tmp$ gcc -ansi -pedantic t.c
takk@deb9:~/tmp$ 

これもOKですね。