• ベストアンサー

関数の引数の書き方。

AとBのどちらの書き方でもよいのですか? 私が読んだ本(やさしいC)には、 Aパターンのみだったような? Aパターン ------------------ void main(int argc,char *argv[]) { int i; ・・・・ } Bパターン ------------------ void main(argc, argv) int argc; char *argv[]; { int i; ・・・・ } http://ash.jp/db/ora_c.htm

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.3

No1の補足でご自身かお書きの通り、ANSIやISOでの標準化前の書式です。 http://ja.wikipedia.org/wiki/C%E8%A8%80%E8%AA%9E#C.E3.81.AE.E8.A6.8F.E6.A0.BC の記述の、「K&R」というのがこの書式です。 ANSI規格化以前は、Cの規格というのが存在しなかったので、「そのときUnixで使われていたCの文法」が事実上の規格でした。世界最初のCについての一般書籍である「The C Programming Language」の著者のカーニハンとリッチの頭文字が K&R で、この本が事実上の規格書でした。第二版はANSI規格のものになっているので、第一版を見る必要があります。訳本だと、 http://www.amazon.co.jp/dp/4320021452

その他の回答 (4)

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.5

>ansi?とかで標準化される前に使っていた書き方でしょうか? ANSI Cで標準化される前というか普及するまでじゃないでしょうか。 今でも使われてることはあるかもしれませんけど。 >ちらほら見かけるので、気持ち悪いです。 過去に書かれたソースやドキュメントもありますし仕方ないかも。

javaeg
質問者

お礼

もやもやが、解けました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

「ちょ~昔」 (K&R の初版の時代, 当然 ANSI 標準化以前) は B の書き方しかできませんでしたが, 今では A の書き方をすべきです... というか, B のような書き方をしなければならない事情がないと言っていいでしょう.

javaeg
質問者

お礼

もやもやが、解けました。

回答No.2

提示されたURLを見ると,「Pro*C」というプリコンパイラだと出ていますね. そのままC言語と比較してもしょうがないと思います. ちなみに,mainの書き方は,仕様上, 「Aパターンだけ」というわけではないはずです.

javaeg
質問者

補足

ご回答ありがとうございます。 以下のページにもあります。 pro*cではありません。 http://otndnld.oracle.co.jp/document/products/E13161_01/tuxedo/docs10gr3/pgc/pgclt.html 私が、みた本でそう書いて有った様なということです。 仕様上、Aパターンのみとは、思っていません。

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

Bパターンはすでに過去のものです。Aパターンで書きましょう。 ついでにmain()関数の型はintですよ。

javaeg
質問者

お礼

もやもやが、解けました。

javaeg
質問者

補足

ごかいとうありがとうございます。 >Bパターンはすでに過去のもの ansi?とかで標準化される前に使っていた書き方でしょうか? ちらほら見かけるので、気持ち悪いです。 検索してもその辺の経緯というか、見つけられません。 気持ち悪いのです。 参考になるページなどあれば、すっきりします。

関連するQ&A

  • メイン関数

    メイン関数には int main(void) と int main(int argc, char** argv) がありますが、後者のint argc, char** argv はどういう意味なのでしょうか?

  • main の引数には const 付けた方が

    C言語での質問です。 引数を取るような main 関数は int main( int argc, char *argv[]){~} とされていますが、argvの指す文字列を変更する、というのはいくら何でもまずいので、 int main( int argc, const char *argv[]){~} あるいは int main( int argc, const char const * const * argv){~} の方がいいのではないでしょうか? 何故、constを付けない形が出回っているのでしょうか?

  • 関数へ引数を渡す時・・・(C言語)

    Cを始めたばかりです。 レベルの低い質問だと思いますがお願いします。 【ソース】 /* a1.c */ #include <stdio.h> void aaa(char); int main( int argc, char *argv[] ) { char box[] = "test"; aaa(box); return 0; } /* a2.c */ #include <stdio.h> void aaa(char box) { printf( "%s",box ); } 【質問】 変数boxの中身を関数aaaに渡したいだけですが、 上記ソースをコンパイルすると、a1.cの aaa(box) の部分でエラーが出てしまいます。 どうもデータ型(ポインタ?)がまずいようですが、 何が問題なのでしょうか? 御回答宜しくお願い致します。

  • コマンドプロンプトを使用してのコマンドライン引数

    winXPのコマンドプロンプトを利用して 参考書「独習C」を使い、C言語の学習をしています。 その本の7.4の項目~main()の引数~で main(int argc,char *avgv[])を利用すると コマンドラインから引数をとることができるとありますが 私の学習環境ではうまくいきません。 具体的には #include <stdio.h> int main(int argc, char *argv[]) { int i; for(i=1; i<argc; i++) printf("%s ", argv[i]); return 0; } というプログラムを実行しても何も表示されません。 どうすればコマンドライン引数を利用できますか?

  • コマンドライン引数 *argv[]はなぜポインタ?

    C言語初心者です。 コマンドライン引数、 int main(int argc, char *argv[]) というのを最近勉強しましたが、引数2番目がポインタになっている理由について、 どなたか教えて下さい。 そういう仕様なんだから、それに従いましょう、ということでしょうか? int main(int argc, char argv[]) では、ダメなのでしょうか? このポインタでの引数渡しについて、 なんらかの納得のいく考え方をご存知の方がいらしたら、教えて下さい。 宜しくお願い致します。

  • main(int argc,char **argv[])の意味を教えて下さい

     今晩は、Cの初心者です宜しくお願いします。  main関数の引数で、int main(int argc,char **argv[])とint main(int argc,char *argv[])と書かれている場合がありますが、 「**argv」と「*argv」の意味の違いはどのようなもので、どのように使い分けるのでしょうか。 また、必ずポインタ型でとるという決まりでしょうか。 宜しくお願いします。

  • OpenGLで登録したコールバック関数の引数

    OpenGLで画面を描画をする際に, 以下のソースのように,glutDisplayFuncに関数を登録しています. main関数で,定義した定数や,そのポインタを display_funcに渡したいと思うのですが, どのような方法があるのでしょうか? 現在,私は,グローバル変数を定義して,それをmain関数とdisplay関数で いじっています. ソースコードの整理,関数化のため,できれば,ポインタや引数を渡したいです. どうぞよろしくお願いします. --------------------------------------------- #include <GL/glut.h> void display_func(void) { 描画内容を記述 } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutCreateWindow(argv[0]); glutDisplayFunc(display_func); glutMainLoop(); return 0; } ---------------------------------------------

  • コマンドライン引数argv[]について

    C言語初心者です。以下のようなプログラムを書いたのですが、コンパイルで来ません。関数func1, func2を分けずに全てメインに書けば動作するのですが、なぜ関数に分けてしまうとコンパイル出来ないのかがわかりません。エラー内容は、argvが宣言されていない、といった内容です。 #include <stdio.h> void func1(void){ printf("%s\n", argv[1]); } void func2(void){ printf("%s\n", argv[2]); } int main(int argc, char *argv[]){ if(strcmp(argv[1], "abc")==0){ func1(); } else{ func2(); } }

  • main関数のとる引数(argc , *argv[])の意味について

     今日は、Cの初心者です宜しくお願いします。    main関数(main(int argc , *argv[]))のとる引数、argcのCと*argv[]のVはどのような意味の略なのでしょうか、 なにか意味があるようなきがするのですが。  宜しくお願いします。

  • プログラミング(配列と関数の引数)

    a : ABCDE a : ABCDEFGH Len : 8 a : FGHIJ a : FGH a : FGH, c : FGH 上記のように表示されるプログラムを作りたいのですが、なかなかできません。下記のようなプログラムを作ったのですがどこが間違っているのかよくわかりません。分かる方、指摘をお願いします。 #include <stdio.h> void my_strcpy(char s[], char t[]); int my_strlen(char s[]); void my_strcat(char s[], char t[]); int main(){ char a[10]; char b[10] = "ABCDE"; char c[] = "FGH"; int len; my_strcpy(a, b); printf("a : %s\n", a); my_strcat(a, c); printf("a : %s\n", a); len = my_strlen(a); printf("Len : %d\n", len); my_strcpy(a, "FGHIJ"); printf("a : %s\n", a); a[3] = '\0'; printf("a : %s\n", a); if(strcmp(a, c) == 0){ printf("a : %s, c : %s\n", a, c); } int i, s, t; my_strcpy(a, b + 2); printf("a : %s\n", a); void my_strcpy(char s[], char t[]){ for (i = 0; t[i] != '\0'; i++){ s[i] = t[i]; } s[i] = '\0'; } int my_strlen(char s[]){ int i; for (i = 0; s[i] != '\0'; i++); return i; } void my_strcat(char s[], char t[]){ int i, j; for (i = 0; s[i] != '\0'; i++); for (j = 0; t[j] != '\0'; i++, j++){ s[i] = t[j]; } s[i] = '\0'; } }

専門家に質問してみよう