web-dev-qa-db-ja.com

clang形式でコードを壊すことはできますか?

clang-formatはコードを再フォーマットするためのツールなので、そのようなフォーマットが機能しているコードを壊したり、少なくともその動作を変更したりする可能性はありますか?コードの動作を変更する、または変更できない契約はありますか?

clang-formatでフォーマットしたいコードがたくさんあります。つまり、多くのコード行が変更されます。 clang-formatのために変更されたすべてのコード行を確認する必要がないことは、このプロセスを大幅に簡略化することになります。

clang-formatはコードの動作を変更しないと思います。一方、これが保証できるかどうか、私は100%確信していません。

29
JFB

確かに、コードの動作を変更する可能性があります。そしてその理由は、Cプログラムがソースコードのいくつかのプロパティを表示できるためです。私が考えているのは__LINE__マクロですが、他に方法がないかどうかはわかりません。

考慮してください1.c

#include <stdio.h>
int main(){printf("%d\n", __LINE__);}

次に:

> clang 1.c -o 1.exe & 1.exe
2

いくつかのclang-format

> clang-format -style=Chromium 1.c >2.c

そして2.cは:

#include <stdio.h>
int main() {
  printf("%d\n", __LINE__);
}

そしてもちろん、出力は変更されました:

> clang 2.c -o 2.exe & 2.exe
3
9
deniss

clang-formatは空白文字のみに影響するため、clang-formatingの前後のファイルが空白文字まで同一であることを確認できます。 Linux/BSD/OS Xでは、difftrを使用できます。

$ diff --ignore-all-space <(tr '\n' ' ' < 2.c ) <(tr '\n' ' ' < 1.c)

1.c:

#include <stdio.h>
int main() {printf("Hello, world!\n"); return 0;}

2.c:

#include <stdio.h>
int main() {
    printf("Hello, world!\n");
    return 0;
}

diffコマンドの出力は空です。つまり、ファイル1.c2.cは空白まで同じです。

Karoly がコメントで述べたように、理想的な条件では、重要なスペースを確認する必要があることに注意してください。文字列リテラル。しかし、現実の世界では、このテストで十分だと思います。

4
Anton K

はい

作業フローを中断しません

システムには設定スイッチがあります:"C_Cpp.clang_format_sortIncludes":falseですが、機能しません。何が問題なのかわかりません...

私のバージョンは:ms-vscode.cpptools-0.13.1

これは私の解決策です:

安定した作業フローのために、文法を使用してください:

// clang-format off

...ここにあなたのコードがあります

// clang-format on

1
hiproz

プロジェクトでこれを効果的に実行したため、clang形式の再フォーマットされたASMコード:

#define ASM _asm

ASM {

  ...

}
1
pdc