标签:文件中 glob 注释 type count == 声明 ati col
在qglobal.h中,定义了很多宏。下面这个QT_REQUIER_CONFIG,展开成:
1 #define QT_REQUIRE_CONFIG(feature) Q_STATIC_ASSERT_X(QT_FEATURE_##feature == 1, "Required feature " #feature " for file " __FILE__ " not available.")
注意宏定义连字符##的作用,看来Q_STATIC_ASSERT_X是一个判断句,如果feature被配置了的话,就没有问题,相反如果没有的话,就报一个错误。
就在同一个文件中,可以看到这个宏的定义:
1 #define Q_STATIC_ASSERT_X(Condition, Message) Q_STATIC_ASSERT(Condition)
继续寻根,还好就在同一个文件的上面一点就找到了:
1 #define Q_STATIC_ASSERT(Condition) 2 enum {Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __COUNTER__) = sizeof(QStaticAssertFailure<!!(Condition)>)}
看到了如此复杂的宏,不觉虎躯一震。继续往上找:
1 #define Q_STATIC_ASSERT_PRIVATE_JOIN(A, B) Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B)
再解一次,终于到头了:
1 #define Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B) A ## B
其实就是将A和B连起来。
而对于赋值号后面的那个部分sizeof(QStaticAssertFailure<!!(Condition)>)},可以继续找到模板类的定义:
1 template <bool Test> class QStaticAssertFailure; 2 template <> class QStaticAssertFailure<true> {};
如果Condition存在的话,也就是被定义过的话,那么!!(Condition)就是1,对应上面的第二行,没有出现问题;否则是0,对应上面的第一行,第一行的意思是声明一个模板类,但是没有定义,所以sizeof为0。为了验证上面两句话的作用,可以新建一个工程,对这两句分别测试:
1 #include <QCoreApplication> 2 template<bool Test> class QStaticAssertFailure; 3 template <> class QStaticAssertFailure<true> {}; 4 int main(int argc, char *argv[]) 5 { 6 QCoreApplication a(argc, argv); 7 sizeof(QStaticAssertFailure<0>); 8 sizeof(QStaticAssertFailure<1>); 9 return a.exec(); 10 } 11 12 template<bool Test> class QStaticAssertFailure;
第3行的部分其实是一个模板类构造函数
标签:文件中 glob 注释 type count == 声明 ati col
原文地址:https://www.cnblogs.com/microthink/p/9534935.html