質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Clang

Clangは、プログラミング言語 C、C++、Objective-C、Objective-C++ 向けのコンパイラである。

Q&A

0回答

2190閲覧

clang-format ForEachMacrosで1行のループを適切にフォーマットしたい

brsice

総合スコア17

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Clang

Clangは、プログラミング言語 C、C++、Objective-C、Objective-C++ 向けのコンパイラである。

1グッド

0クリップ

投稿2019/08/26 23:40

clang-formatの設定項目に、一部のマクロを繰り返し文として処理させるForEachMacrosがあります。
これを使って(あるいは使わずに)通常のfor文と同じようにフォーマットさせたいのですが、中身が1行の場合にうまくいきません。
AllowShortFunctionsOnASingleLine: Inlineにしたまま、以下で示すような通常のfor文の場合と同じフォーマットを実現することはできますか?

試したこと

C++

1#define FOR(x) for(x)

通常の"for"と同じマクロ"FOR"を定義していくつか試しました。
本来意図する動作は、下記のfor文を用いた際のフォーマットです。
FORマクロを用いた場合、以下のような問題が起きます。
・ループの中身が1行でも改行している
・中括弧があっても改行していない

clangFormat

1AllowShortBlocksOnASingleLine: false 2AllowShortLoopsOnASingleLine: true 3ForEachMacros: ["FOR"]

C++

1// for 2for (int i = 0; i < 10; ++i) continue; 3for (int i = 0; i < 10; ++i) { 4 continue; 5} 6for (int i = 0; i < 10; ++i) { 7 std::cout << i << std::endl; 8 continue; 9} 10 11// FOR macro 12FOR (int i = 0; i < 10; ++i) 13 continue; 14FOR (int i = 0; i < 10; ++i) { continue; } 15FOR (int i = 0; i < 10; ++i) { 16 std::cout << i << std::endl; 17 continue; 18}

ForEachMacrosを設定しないと関数呼び出しのように動作するので、AllowShortFunctionsOnASingleLine: Inlineに設定しました。
小括弧の前に空白が取られなくなりましたが、中身が1行の場合に改行しなくなります。
中括弧があっても改行はされないままです。

clangFormat

1AllowShortBlocksOnASingleLine: false 2AllowShortLoopsOnASingleLine: true 3AllowShortFunctionsOnASingleLine: Inline

C++

1// FOR macro 2FOR(int i = 0; i < 10; ++i) continue; 3FOR(int i = 0; i < 10; ++i) { continue; } 4FOR(int i = 0; i < 10; ++i) { 5 std::cout << i << std::endl; 6 continue; 7}

clangFormat

1AllowShortBlocksOnASingleLine: false 2AllowShortLoopsOnASingleLine: true 3AllowShortFunctionsOnASingleLine: Empty

最後に、AllowShortFunctionsOnASingleLine: Emptyに設定しました。
小括弧の前に空白が取られないままですが、基本的には目的のフォーマットになっています。
クラス内ではないのに、なぜ"Inline"と"Empty"で違いが出るのか分かりません。
小括弧の前に空白がないのはとりあえず良いとしても、AllowShortFunctionsOnASingleLine: Inlineにしたいのでこの設定を使うことはできません。

C++

1// FOR macro 2FOR(int i = 0; i < 10; ++i) continue; 3FOR(int i = 0; i < 10; ++i) { 4 continue; 5} 6FOR(int i = 0; i < 10; ++i) { 7 std::cout << i << std::endl; 8 continue; 9}
alphya👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/08/27 04:32 編集

えっと、フォーマッタで整形するのは分かるのですが、・・・マクロが展開された時、全てのパターンでコンパイルできるソースになると思いますか?(ちょっと大げさ^^;) #開発会社であればソースのフォーマットは各プロジェクト毎に決まっているはずなので、FORのマクロって個人趣味で作っても意味があるのか? また、 保守などを考えると、設定ファイル(.clang-format)も引き継がなくてはならないとしたら?って思います。
brsice

2019/08/27 21:45 編集

>マクロが展開された時、全てのパターンでコンパイルできるソースになると思いますか? 言わんとしていることはおそらく分かるのですが、中括弧があればどこまでをループの範囲にするべきかどうかというのは一意に決まるのではないでしょうか? リファレンスのForEachMacrosの例にBOOST_FOREACHがありますが、BOOST_FOREACHのように括弧の使い方がfor文と同様のマクロを想定しているのだとすれば、今回の私の要求は実現できるのでは、と思いました。 また保守面については、私は趣味のみでプログラムを書いており、複数人で共有することは一切ないため問題ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問