clang-format: C++ 属性を制御する設定 質問する

clang-format: C++ 属性を制御する設定 質問する

検索中Clang 形式のスタイル オプションC++ 属性の配置に関する動作を制御する方法が見つからないようです。

例として、次の 2 つの宣言を考えます。最初の宣言は列制限を超えませんが、2 番目の宣言はオーバーフローします。

template <typename TChar>
[[gnu::always_inline]]
static ptr<TChar> within_limit(ptr<TChar> first, ptr<TChar> last);

template <typename TChar, typename FApply, typename... FApplyRest>
[[gnu::always_inline]]
static ptr<TChar> overflow(ptr<TChar> first, ptr<TChar> last, const FApply& apply, const FApplyRest&... apply_rest);

をどのように調整しても.clang-format、出力は次のようになります。

[[gnu::always_inline]] static ptr<TChar> within_limit(ptr<TChar> first, ptr<TChar> last);

[[gnu::always_inline]] static ptr<TChar>
overflow(ptr<TChar> first, ptr<TChar> last, const FApply& apply, const FApplyRest&... apply_rest);

属性を型と同じ行に配置すると、(私にとっては) 読みにくくなるため、clang-formatこの方法は避けた方がよいでしょう。 を使用すると、__attribute__((always_inline))同じ動作が示されます。 1 つのリスト ( [[noreturn, gnu::cold]]) に複数の属性を指定すると、再フォーマットが行われます ([[ noreturn, gnu::cold ]]理由は不明ですが )。フォーマッタは、属性について少なくとも基本的な理解を持っています。

それで:属性を独自の行に配置する方法はありますかclang-format( の C++ 相当BreakAfterJavaFieldAnnotations)?


回避策の試み

// clang-format off/の使用// clang-format onわかった一時的なものではありますが、恒久的な解決策としては明らかに不器用すぎます。宣言は適切な形式でフォーマットする必要があります。それだけでなく、プロジェクトでは多くの属性を使用する必要があるため、いたるclang-formatところにコメントがあると読みにくくなると言えます。

理論的には を使用するとCommentPragmas無効化をよりローカライズできるようになりますが、出力はまだかなり奇妙です。

template <typename TChar>
[[gnu::always_inline]] // NO-FORMAT: Attribute
    static ptr<TChar>
    within_limit(ptr<TChar> first, ptr<TChar> last);

ベストアンサー1

あなたが求めている機能はclang-format 16で追加されました。属性はBreakAfterAttributes (ドキュメンテーション)、要求した動作(属性グループの後の改行)は ですAlways

この属性のセクションドキュメント:

属性後のブレーク

関数宣言/定義名の前で、C++11 属性のグループの後に改行します。

可能な値:

  • ABS_Always(構成内: Always) 常に属性の後で区切ります。
[[nodiscard]]
inline int f();
[[gnu::const]] [[nodiscard]]
int g();
  • ABS_Leave(設定内: Leave) 属性の後の改行はそのままにしておきます。
[[nodiscard]] inline int f();
[[gnu::const]] [[nodiscard]]
int g();
  • ABS_Never(構成内: Never) 属性の後では決して分割しません。
[[nodiscard]] inline int f();
[[gnu::const]] [[nodiscard]] int g();

後にブレークするための設定はないようですそれぞれclang-format 17 の時点でのグループ内の属性。ここに来る誰かがそれに興味を持っている場合。例:

// Even `Leave` will format this into one line
[[gnu::const]]
[[nodiscard]]
int g();

提案された行コメントのトリックポセイドン別の答えこれには有効です。

// Will remain like this when using `Leave` or `Always`
[[gnu::const]] // <-- Empty line comment after each attribute you want a break after
[[nodiscard]]
int g();

おすすめ記事