如何使c ++代码的clang格式跳过部分
Posted
技术标签:
【中文标题】如何使c ++代码的clang格式跳过部分【英文标题】:How to make clang-format skip sections of c++ code 【发布时间】:2016-01-20 09:10:19 【问题描述】:有没有办法配置clang-format
工具来跳过我的Qt::connect
函数调用?我的构造函数中有几个连接,如下所示:
connect( m_Job, SIGNAL( error( const QString&, const QString& ) ), this, SLOT( onError( const QString&, const QString& ) ) );
connect( m_Job, SIGNAL( message( const QString& ) ), this, SLOT( onMessage( const QString& ) ) );
connect( m_Job, SIGNAL( progress( int, int ) ), this, SLOT( onProgress( int, int ) ) );
但在我运行格式化工具后,它的可读性会降低:
connect( m_Job, SIGNAL( error(const QString&, const QString&)), this, SLOT( onError(const QString&, const QString&)) );
connect( m_Job, SIGNAL( message(const QString&)), this, SLOT( onMessage(const QString&)) );
connect( m_Job, SIGNAL( progress(int, int)), this, SLOT( onProgress(int, int)) );
【问题讨论】:
这能回答你的问题吗? How to mark a region so clang-format won't touch it? 【参考方案1】:使用// clang-format off
和// clang-format on
使其跳过代码部分。
// clang-format off
// Don't touch this!
connect( m_Job, SIGNAL( error( const QString&, const QString& ) ), this, SLOT( onError( const QString&, const QString& ) ) );
connect( m_Job, SIGNAL( message( const QString& ) ), this, SLOT( onMessage( const QString& ) ) );
connect( m_Job, SIGNAL( progress( int, int ) ), this, SLOT( onProgress( int, int ) ) );
// clang-format on
// Carry on formatting
【讨论】:
我应该怎么做?请写一些细节。 @p.i.g.从字面上看,只需在您的代码周围添加这些 cmets 即可让 clang-format 忽略它。如果您暂时无法全神贯注,只需复制粘贴此答案中的代码即可。一旦你这样做就会很清楚:)【参考方案2】:顺便说一句:您应该对信号/插槽签名进行规范化。因此,不需要引用和常量引用,Qt 中的签名规范化代码只是将它们删除。如果是this
,也不需要第三个参数。
您的代码应如下所示:
connect(m_Job, SIGNAL(error(QString,QString)), SLOT(onError(QString,QString)));
connect(m_Job, SIGNAL(message(QString)), SLOT(onMessage(QString)));
connect(m_Job, SIGNAL(progress(int,int)), SLOT(onProgress(int,int)));
如果您坚持,参数类型之间当然可以有空格,当然会以一些运行时成本为代价,因为规范化代码不再是空操作。
您还可以利用QMetaObject::connectSlotsByName
摆脱显式连接。这要求m_Job
是this
的孩子,并且有一个名字。例如:
class Foo : public Q_OBJECT
Job m_job;
Q_SLOT void on_job_error(const QString&, const QString&);
Q_SLOT void on_job_message(const QString&);
Q_SLOT void on_job_progress(int, int);
public:
Foo(QObject * parent = 0) :
QObject(parent),
m_job(this)
m_job.setObjectName("job");
QMetaObject::connectSlotsByName(this);
;
名称为on_name_signal
的插槽将由connectSlotsByName
自动连接。 name
是发送者对象的名称,signal
是信号的名称。
最后,过多的空格会使您的代码更难阅读,而不是更容易阅读。这不是风格问题,而是简单的生理学问题。 Fovea centralis 的直径约为 2 度角。一个角度的视觉角度大约是拇指在手臂长度处的宽度。阅读带有过多空白的代码需要更多的扫视/注视来沿着代码行重新定位您的中心视觉。图 0.15-0.2s 需要处理每个注视值的数据并将其与您正在阅读的代码的心理模型集成。都是可以衡量的。
作为一个轶事,而不是医疗建议:如果我的鼻子上没有 +0.5 眼镜,我无法阅读密集的乐谱。我的视力在其他方面完全正常。 YMMV。
【讨论】:
【参考方案3】:您可以使用new signal slot syntax 以获得更好的可读性。它看起来更简单
connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue);
【讨论】:
这种语法的另一个好处,你的编译器会抱怨不存在/不兼容的语法/槽,而旧语法会产生运行时错误 好的,我知道,但最好使用类似表格的布局来达到这个目的,就像在我的第一个示例中一样。带有标题的表:发送者、信号、接收者、插槽。如果我有很多连接并且我不使用这种格式,那么它就很难阅读。我使用 Qt5。以上是关于如何使c ++代码的clang格式跳过部分的主要内容,如果未能解决你的问题,请参考以下文章