TVアニメ『悪偶 -天才人形-』7/9(月)深夜0時~TOKYO MX他に放送開始 PV第2弾
アニメ『悪偶 -天才人形-』
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ですね。
コメント