C言語用インデントの挙動が期待通りではなNo.24037
緒方聡 さん 07/11/14 11:44
 
[ファイルタイプ別の設定] ⇒ [体裁] ⇒ [インデント] ⇒ [C言語用インデント] に
チェックが入っている状態で、以下のソースで挙動が異なります。


// インデントが正しくない
void foo1(struct BAR *bar,
        struct BAZ *baz,
        int i)  {
            hoge();
}

// インデントが正しい
void foo2(struct BAR *bar,
        int i)  {
    hoge();
}

[ ]
RE:24037 C言語用インデントの挙動が期待No.24040
秀丸担当 さん 07/11/14 14:23
 

>// インデントが正しくない
>void foo1(struct BAR *bar,
>        struct BAZ *baz,
>        int i)  {
>            hoge();
>}

調べてみたら、インデントと計算するときにC言語の予約語が行の先頭にある場
合は必ずそこからインデントするようになっていました。
structがそれにあたります。
たとえば for や if といった予約語がある場合は、括弧の状態に関わらず編集
している途中と判断するために、そのようになっているのだと思います。
structの場合はどちらとも取れるので、このような判断は余計かもしれないです
が、関数の引数にはstructを書かなくてもできるので、この書き方も一般的では
ないような気もします。
とりあえず意図的にしていることなので、このままとしておこうかと。

[ ]
RE:24040 C言語用インデントの挙動が期待No.24041
Kaisan さん 07/11/14 15:05
 
横から失礼します。

> structの場合はどちらとも取れるので、このような判断は余計かもしれないです
> が、関数の引数にはstructを書かなくてもできるので、この書き方も一般的では
> ないような気もします。

structは、C++では省略できますが、Cでは省略出来なかったと思います。
(C++ではclassの特殊形)

このため、Cでは typedef や #define なので別名を付けることが多いです。

[ ]
RE:24041 C言語用インデントの挙動が期待No.24042
秀丸担当 さん 07/11/14 16:55
 

>structは、C++では省略できますが、Cでは省略出来なかったと思います。
>(C++ではclassの特殊形)
>
>このため、Cでは typedef や #define なので別名を付けることが多いです。

そうでしたか。失礼しました。
ということは、どちらかというと書くほうが正規の書き方っぽいですね。
個人的にはどちらもでいいですが、ずっと以前からこうだったので、いまさら変
えていいものかと思います。
あと似たものとして class と enum もあって、細かいところで悩ましいです。

[ ]
RE:24042 C言語用インデントの挙動が期待No.24044
緒方聡 さん 07/11/15 09:32
 
C言語用インデントは変だな、と思うところが他にもあって、

// 期待通りのインデント
class foo { // 次の行は TAB がある
   
    foo() {
        bar();
    }
};


// インデントが足りない
class foo { // 次の行は改行のみ

    foo() {
    bar();
}
};

上記のような場合もインデントがうまくいきません。
この場合は、最初のメソッドのインデントを自力で整えれば
それ以降は期待通りに動作します。

先の報告もそうですが、こちらもあわせていつか期待通りに
インデントするようにしていただければなぁ、と思う次第ですが
難しいでしょうか。

[ ]
RE:24044 C言語用インデントの挙動が期待No.24045
秀丸担当 さん 07/11/15 15:20
 

>上記のような場合もインデントがうまくいきません。
>この場合は、最初のメソッドのインデントを自力で整えれば
>それ以降は期待通りに動作します。

確かにこの場合に違うのは違和感がありますね。将来的なバージョンで同じにな
るように検討したいと思います。

>先の報告もそうですが、こちらもあわせていつか期待通りに
>インデントするようにしていただければなぁ、と思う次第ですが
>難しいでしょうか。

structの件はこのままにしておこうと思います。

現状では、自動起動マクロで「編集後タイマー」のマクロを設定して、改行した
直後のマクロを作っておくと、好きなようにカスタマイズできるかもしれません。

[ ]