经常在Qt工程中看到QT_CONFIG宏,如下:
#if defined(QT_PRINTSUPPORT_LIB) && QT_CONFIG(printdialog)
// 其它代码略
又例如:
#if QT_CONFIG(opengl) // 是否支持OpenGL
m_pbuffer_size = 1024;
#endif
// 其它代码略
问题的提出:
- QT_CONFIG宏的含义是什么?
- QT_CONFIG用法,主要是参数怎么传?
QT_CONFIG的定义在Qt安装目录下的include\QtCore\qglobal.h 头文件中定义的,如下:
/*
The QT_CONFIG macro implements a safe compile time check for features of Qt.
Features can be in three states:
0 or undefined: This will lead to a compile error when testing for it
-1: The feature is not available
1: The feature is available
*/
#define QT_CONFIG(feature) (1/QT_FEATURE_##feature == 1)
上面的注释说得很明白,就是:
QT_CONFIG宏实现了一个在编译时期安全检查,检查指定的Qt特性是否存在或是否可利用。返回值如下:
0或者未定义:这将导致一个编译时期的错误(有点类似C++11的static_assert,其实其幕后就是static_assert实现的)。
-1:指定的Qt特性不可用。
1:指定的Qt特性可利用。
可以看到QT_CONFIG展开对应为(1/QT_FEATURE_##feature == 1),大家要注意C语言宏表达式中##号的含义,如果不懂,请参考《C++/C宏定义中## 连接符与# 符的含义》文章。说白了,宏##就是连接符的作用,就是把QT_FEATURE_ 和feature连接为一个整体,如:当调用QT_CONFIG(opengl),则展开后为:(1/QT_FEATURE_opengl == 1)。而在Qt安装目录下的很多模块下有xxxx-config.h文件,如:QtGui模块就有一个qtgui-config.h文件,位于include\QtGui目录,该文件内容如下:
可以看到定义了一些宏,而这些宏除去开头的QT_FEATURE_部分外的就是传给QT_CONFIG的参数,如:QT_FEATURE_opengl,则传入opengl到QT_CONFIG宏,就可以检测opengl是否配置了
QT_FEATURE_opengl为1,传入QT_CONFIG宏后变为1/QT_FEATURE_opengl == 1,即为1/1 == 1,也即为true,证明opengl可用。