C言語 変数の宣言位置

2006 年 4 月 21 日 | カテゴリー: プログラム

gcc だとコンパイルできて cl だとコンパイルできない件、原因解明。

コンパイルエラーになるソース。

double trapezoid(double (*g)(double), double a, double b, int n) {
    double s = 0.0;
    double h = (b-a)/n;
    s += (g(a)+g(b))*h/2.0;
    int i;

    for(i=1; i<n; i++) {
        s += g(a+i*h)*h;
    }
    return s;
}

コンパイルできるソース。

double trapezoid(double (*g)(double), double a, double b, int n) {
    int i;
    double s = 0.0;
    double h = (b-a)/n;
    s += (g(a)+g(b))*h/2.0;
    for(i=1; i<n; i++) {
        s += g(a+i*h)*h;
    }
    return s;
}

C言語では int i のような宣言はすべて最初のほうに書いてあげないといけないんですって。
Java みたいにどこでも書いていいわけじゃない、つまり使う直前で宣言する、とかはやっちゃいけないんだとか。

あと調べてるついでに知ったおまけとしては、C言語でのコメントは /* */ のみで // はC++じゃないと許されないんだとか。最近のコンパイラは // でもコメントとして認識してくれたりしますが、ANSI C でダメって書いてありました。これはC言語のバイブルを手元に置いておいたほうがいいなあって思いました。

  1. 2006 年 4 月 22 日 00:10

    普通に//を使っていたわけですが…。
    ANSI C的には駄目って出てるんですねorz

  2. 2006 年 4 月 22 日 23:24

    ポインタで関数指定するのは確かに熱いなあとか、でもクラスがないのはやっぱり気持ち悪いなあとか、そんなのを考えながらいかに美しく書けるかを模索し始めた廃人です(マテ

    C++ は C とは全然違うよなあなんていつも思ってるけど、ここで C# か!?
    いやでもやっぱり Java がすき。

  3. みやびぃ
    2006 年 4 月 23 日 04:10

    ANSI Cから習った者に言わせれば/**/は常識なんだけどなぁ…。

    今ってANSI Cって使わないのかなぁ…。
    どうなの?

  4. 2006 年 4 月 23 日 04:43

    もちろん『/* */』でコメントアウトなのは常識なわけですが、『Java を先に覚えて C は似たような書き方でできる』だと『コメントアウトは /* */ もしくは // の”どっちでもいいよ”』と覚えてるのですよ。

    んで C でコメントを書くときも 『//』でコンパイル通っちゃうものだから気づかないんですけど、『コメントは/* */だけだよ♪』って言われると『へぇへぇへぇ』ってなるというわけで。

    基本は ANSI C だと思いますよー。稀に ANSI じゃない C を読むことはありますけど。本屋にいけばきっとANSI 規格準拠!とか謳ってるのがほとんどかと。