Visual Studio的C++代码格式化可选使用clang-format, 但它只提供默认样式, 如果想使用自定义样式则需要在每个项目目录下放一个.clang-format
或_clang-format
文件, 没有对全部项目通用的可自定义样式
当项目目录没有.clang-format
或_clang-format
文件时, VS使用自定义的默认格式化样式, 而当项目目录存在.clang-format
或_clang-format
文件时则使用它们进行格式化
这里发现VS的格式设置中有一个使用自定义clang-format.exe文件选项
所以我尝试写了一个中转exe让VS使用, 并且将clang-format.exe
放在了中转exe的同级目录
通过同级目录下clang-format.txt
来设置自定义的默认样式, 具体设置参照clang-format官方文档
(当启用了这个中转exe时, VS自带的默认格式设置样式选项将无效, emmm都自定义了当然就不用它自带的啦)
以下是中转exe的源代码, 小白刚学C++, 还请大佬勿喷
#include
#include
#include
#include
#include
#include
using namespace std;
// 读文本文件, 并将带换行的文件读成一整行返回
string read_text_file(const char* file_name) {
fstream fin(file_name, ios::in);
assert(fin.is_open());
string line_text;
string all_text;
while (getline(fin, line_text)) {
all_text += line_text;
}
fin.close();
return all_text;
}
// 判断文件是否存在
bool file_exist(const char* file_name) {
fstream fin(file_name, ios::in);
bool exist = false;
if (fin) {
exist = true;
fin.close();
}
return exist;
}
int main(int argc, char* argv[]) {
const string space = " ";
string file_path = argv[0];
string file_dir = file_path.substr(0, file_path.find_last_of("\\") + 1); // 当前exe文件所在目录
stringstream command;
command << file_dir << "clang-format.exe";
// 如果项目目录存在.clang-format或_clang-format
// VS的调用路径在项目目录, 所以使用相对路径
if (file_exist(".clang-format") || file_exist("_clang-format")) {
for (int i = 1; i < argc; i++) {
string arg = argv[i];
command << space << arg;
}
} else {
// 否则去掉VS传的-style和-fallback-style参数
string format_text = read_text_file((file_dir + "clang-format.txt").data());
command << space << "-style=\"{" << format_text << "}\""; // 使用{key: value}形式写入自定义默认值
for (int i = 1; i < argc; i++) {
string arg = argv[i];
if (arg.find("-style=") == string::npos) {
// 去掉VS传的-style和-fallback-style参数
command << space << arg;
}
}
}
return system(command.str().data()); // 将clang-format的结束状态返回, 提供给VS结果信息
}
这里贴上我个人习惯使用的代码格式化样式(上面贴的代码就是用这个格式化出来的)
以下是clang-format.txt
内容(key: value
)
AccessModifierOffset: -4,
AlignEscapedNewlines: Left,
AllowShortFunctionsOnASingleLine: Inline,
ColumnLimit: 110,
IndentCaseLabels: true,
IndentWidth: 4,
KeepEmptyLinesAtTheStartOfBlocks: false,
PointerAlignment: Left,
SpaceAfterCStyleCast: true,
SpacesBeforeTrailingComments: 2,
TabWidth: 4
emmm其实这步有点多余, 因为前面已经写过使用方法啦, 但这里还是再整理一下
VisualStudio
目录custom-format.exe
并确定