【Qt开发】C/C++自动代码规范格式软件

【Qt开发】C/C++自动代码规范格式软件

开源地址:
gitee地址

后续更新以gitee为准

视频:

【Qt开发】C/C++自动代码规范格式软件

AStyle

AStyle是个跨平台开源工具,Windows、Linux、macOS都能用。
下载地址:https://sourceforge.net/projects/astyle/

AStyle的命令参数:
比如我的命令是:-n !E --style=allman -p -s4 -S -f -xW -w -xw
-n不生成备份文件,原文件直接覆盖,没后悔药。
!E文件路径 如果在keil里面做脚本配置 这里就是替换为当前文件地址
--style=allman用Allman风格,大括号独占一行,代码看着清楚。
-p指针和运算符两边加空格,比如x=y变x = y。
-s4缩进用4个空格,比默认2空格更明显。
-Sswitch里的case缩进一层,结构更分明。
-f空的{}强制换行,格式统一。
-xWC++类修饰符(public/private)缩进对齐,C代码用不上。
-w多行条件语句加括号,比如if (a && b)变块状。
-xwwhile/do-while循环体再缩进一层,突出循环。

使用起来很简单
譬如:

D:\astyle-3.6.7-x64\astyle.exe -n .\RTE\Device\STM32L496RGTx\STCubeGenerated\Src\main.c --style=allman -p -s2 -S -f -xW -w -xw

Qt

在Qt中 使用QProcess即可实现shell命令
推荐使用函数:

shell.execute(cmd,arg);

其中 arg是QStringList
譬如:

void MainWindow::on_pushButton_4_clicked()
{
    uint32_t len = File_List.size();
    uint32_t i =0;
    QString path;
    QString cmd;
    QStringList arg;
    arg.clear();
    arg.append("");
    if(this->ui->c1->checkState())
    {
        arg.append("--style=allman");
    }
    if(this->ui->c2->checkState())
    {
        arg.append("-p");
    }
    if(this->ui->c3->checkState())
    {
        arg.append("-S");
    }
    if(this->ui->c4->checkState())
    {
        arg.append("-f");
    }
    if(this->ui->c5->checkState())
    {
        arg.append("-xW");
    }
    if(this->ui->c6->checkState())
    {
        arg.append("-w");
    }
    if(this->ui->c7->checkState())
    {
        arg.append("-xw");
    }

    if(this->ui->comboBox->currentIndex())
    {
        arg.append("-s4");
    }
    else
    {
        arg.append("-s2");
    }

    if(this->ui->c0->checkState())
    {
        arg.append("-n");
    }

    if(len == 0)
    {
        qDebug()<<"No File\n";
    }
    else
    {
        for(i=0;i<len;i++)
        {
            path = File_List[i];
            qDebug()<<"Trans style..."<<path<<"\n";
            cmd = astyle_path;
            arg[0]=path;
            shell.execute(cmd,arg);
            shell.waitForFinished(); //等待shell命令执行完成
            qDebug()<<"Done\n";
            QFile file(path);//创建文件对象
            if (file.open(QIODevice::ReadOnly))//只读方式打开
            {
                QString content = file.readAll();//读取内容
                this->ui->textEdit_2->setText(content);
                file.close();//关闭文件
            }
            else
            {
                qDebug() << "Failed to open file\n";//showMessage("文件打开失败")
            }
        }
    }
}

效果

在这里插入图片描述
在这里插入图片描述

附录:C语言到C++的入门知识点(主要适用于C语言精通到Qt的C++开发入门)

C语言与C++的不同

C语言是一门主要是面向工程的语言
C++则是面向对象

C语言中 某些功能实现起来较为繁琐
比如结构体定义:

一般写作:

typedef struct stu_A
{
}A;

也可以写作:

typedef struct 
{
}A;

但 大括号后面的名称是不可省去的

不过 C++的写法就比较简单
除了支持上述写法外

也支持直接声明

typedef struct A
{
}

另外 C++是完全支持C语言库和语法的
不过C++里面的库也有些很方便的高级功能用法 只不过实现起来可能不如C的速度快

再者 C语言与C++的编译流程不一样
C语言没有函数重载 所以给编译器传参就是直接传函数名称
但是C++除了传函数名称外 还会穿函数的参数、类型等等 以实现函数重载

C++中写C语言代码

上文提到 C++可以完全兼容C的写法
但是编译流程也还是不一样
所以如果在编译层面进行C语言代码编译 则通常用以下方法:

extern "C"
{
...
}

表面大括号内的内容用C的方法进行编译

另外 如果还是用C++的编译器 但要实现C语言函数 则需要用到C语言的库

在C语言中 我们一般用如下方法导入库

#include <stdio.h>

此方法同样适用于C++ 但是C++可以更方便的写成去掉.h的方式
比如:

#include <iostream>

在C++中 为了调用C语言的库 可以采用在原库名称前加一个"c"的方式导入
如:

#include <cstdio>

这样就可以使用printf等函数了 甚至比C++的std方法更快

C语言到C++的知识点

在这里插入图片描述

Qt开发中需要了解的C++基础知识

namespace

C++面向对象的特性下诞生的一个名称
表示某个函数、变量在某个集合下 用作namespace
比如 <iostream>库中的关键字cin在std下 则写作std::cin
std就是namespace
::表示某空间下的某某
前面是空间名称 后面是变量、函数名称

using namespace可以告诉编译器以下都用xx名称空间
比如:

using namespace std;
cout<<"a";

如果没有告诉编译器所使用的空间名称 则要写成:

std::cout<<"a";

同样 可以自定义某一段代码属于哪个空间:

namespace xx
{
...
}

输入输出

在C++中 用iostream作为输入输出流的库

#include <iostream>

用cin和cout关键字进行输入和输出
如:

using namespace std;
int a=0;
cin>>a; //输入到a

cout<<a;  //输出a

类比scanf和printf
同样 还有一个关键字endl表示换行
cout和cin的传参是不固定的
由编译器自行裁定

字符串类型

在C语言中 常用char *表示字符串
但是在C++中 可以直接用string类型
比如:

char * s="456";
string str="123";

由于cout的特性 这两种字符串都可以直接打印
但如果使用C语言中printf的打印方式时 采用%s方式打印字符串 则不能传入string类型

class类

C++的核心就是class
同Python等支持面向对象的语言一样
可以理解成一个支持函数、继承、自动初始化、销毁的结构体
在class类中 有private私有、public公有变量
前者只能内部访问 后者可以外部调用使用
如:

class A
{
public:
int a;
private:
int b;
}

a可以用A.a的方式方位 b则外部无法访问

构造函数和析构函数(解析函数)

构造函数可以理解成对类的初始化 反之析构函数则是退出时进行销毁前的函数
两者需要与类的名称相同 析构函数则在前面加一个~表示非
如:

class A
{
public:
int a;
A();
~A();
private:
int b;
}

A::A()
{
...
}

A::~A()
{
...
}

构造函数可以定义传参 析构函数则不行

类的继承

如果有两个类A和B 想让A里面包含B 则可以写作继承的写法
继承后 A类的变量可以直接调用B下面的成员
如:

class B
{
int b;
}
class A: public B
{
int a;
}

在定义A后 可以访问到B的成员b 当然 继承也可以私有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式拳铁编曲MikeZhou

光电帝国,光联万物!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值