经常在Qt工程中看到QT_CONFIG宏,如下:

#if defined(QT_PRINTSUPPORT_LIB) && QT_CONFIG(printdialog)
// 其它代码略

又例如:

#if QT_CONFIG(opengl) // 是否支持OpenGLm_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 available1: 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可用。

QT_CONFIG宏用法及支持的参数相关推荐

  1. 【C语言】宏定义(不带参数的宏定义和带参数的宏定义)

    目录 一.不带参数的宏定义 1.定义 2.#undef 指令取消宏定义 二.带参数的宏定义 1.定义 2.宏定义参数替换的注意事项 三.带参数的宏定义和带参函数的区别 一.不带参数的宏定义 1.定义 ...

  2. ACMNO.30 C语言-宏交换 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。

    题目描述 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参.输出已交换后的两个值. 输入 两个数,空格隔开 输出 交换后的两个数,空格隔开 样例输入 1 2 样例输出 2 ...

  3. js获取url地址栏参数的方法,解决中文乱码问题,能支持中文参数

    js获取url地址栏参数的方法,解决中文乱码问题,能支持中文参数 参考文章: (1)js获取url地址栏参数的方法,解决中文乱码问题,能支持中文参数 (2)https://www.cnblogs.co ...

  4. pyrealsense2 sensor.get_supported_options()(获取当前sensor支持的参数)

    文章目录 获取当前color sensor支持的参数 获取当前depth sensor支持的参数 获取color_sensor和depth_sensor各自不同的参数 获取color_sensor和d ...

  5. go函数详解:函数定义、形参、返回值定义规范、函数内存分析、不支持重载、支持可变参数、基本数据类型和数组默认都是值传递的、支持自定义数据类型、函数返回值命名

    引入 [1]为什么要使用函数: 提高代码的复用型,减少代码的冗余,代码的维护性也提高了 [2]函数的定义: 为完成某一功能的程序指令(语句)的集合,称为函数. [3]基本语法 func 函数名(形参列 ...

  6. Golang中支持可变参数

    Golang中支持可变参数 (如果你希望函数带有可变数量的参数) package main import "fmt" //定义一个函数,函数的参数为:可变参数 ... 参数的数量可 ...

  7. BOOST_MP11_VERSION宏用法的测试程序

    BOOST_MP11_VERSION宏用法的测试程序 实现功能 C++实现代码 实现功能 BOOST_MP11_VERSION宏用法的测试程序 C++实现代码 #include <boost/m ...

  8. BOOST_LOG_UNIQUE_IDENTIFIER_NAME宏用法的测试程序

    BOOST_LOG_UNIQUE_IDENTIFIER_NAME宏用法的测试程序 实现功能 C++实现代码 实现功能 BOOST_LOG_UNIQUE_IDENTIFIER_NAME宏用法的测试程序 ...

  9. BOOST_CURRENT_FUNCTION宏用法的测试程序

    BOOST_CURRENT_FUNCTION宏用法的测试程序 实现功能 C++实现代码 实现功能 BOOST_CURRENT_FUNCTION宏用法的测试程序 C++实现代码 #define BOOS ...

最新文章

  1. ​Nessus更新到8.9.1
  2. sybase 数据导入mysql_Windows环境下Sybase12.5 数据库创建与导入数据库.docx
  3. 【原理+实战+视频+源码】docker权限参数
  4. 拆分工作簿为多个文件_如何批将Excel的多个Sheet工作表拆分为独立的工作簿?...
  5. 多目标进化优化 郑金华pdf_简化审批流程 金华首张以“告知承诺制”审批的医疗器械经营许可证发放...
  6. jQuery中的子(后代)元素过滤选择器(四、六):nth-child()、first-child、last-child、only-child...
  7. MySQL替换函数REPLACE替换字符串方法
  8. 添加子节点时报错:TypeError: oUl.appendChild is not a function
  9. Oracle密码过期怎么办
  10. UE4C++ Http下载文件
  11. 微支付几个参数的获得
  12. 计算机硬件选购与市场调查实验报告,计算机组装与维护实训报告范例-20210527010902.docx-原创力文档...
  13. cpu温度过高 ubuntu_Ubuntu/Debian 查看CPU温度的方法
  14. 威锋十年:叫一声「果粉」,你还敢答应吗?
  15. AudioTrack音频播放
  16. Error:Attempt to invoke virtual method ‘void android.widget.TextView.setText(java.lang.CharSeq
  17. java excel cell 设置样式_java中对Excel的创建、样式修改
  18. pb3-protobuf 格式-上传 网络信息内容
  19. IIS配置反向代理URL rewrite.dll加载失败
  20. 云队友丨追求复利人生,升级思维模型的四个层级

热门文章

  1. 2021考研报考人数377万,读研VS工作,哪个更值得?
  2. C语言状态机编程思想
  3. python学习之turtle库基本操作
  4. 服务器mtf路径文件损坏,来自节点 js 服务器的错误但不指向任何特定文件
  5. bat java 指定堆大小_jvm 堆内存 栈内存 大小设置 查看堆大小
  6. java 12错误_Java异常处理的12条军规总结
  7. python123温度转换-python二级备考 day2
  8. 自动检测CSRF漏洞的工具
  9. 牛客假日团队赛5 L Catch That Cow HDU 2717 (BFS)
  10. ASP.NET Core 依赖注入