带有验证的C ++编译时类名字符串

时间:2015-07-06 23:49:59

标签: c++ macros static-analysis

我想在编译时从类中获取字符串,但如果该类在该范围内不存在,也会想要一个错误,所以这还不够:

#define CLASS_STR(c) # c

我想我可以将后期构建脚本编写为某种静态分析器。

一个例子是libextobjc http://devetc.org/code/2014/05/17/safe-and-sane-key-paths.html

中的密钥路径检查

真的应该很容易掌握。不应该编写“MyClass”,而应该使用一个可以在字符串中返回类名的宏,同时还要确保该类在范围内可见。

1 个答案:

答案 0 :(得分:0)

这是一种方法:

#include <iostream>
#include <MyLib/MyClass.h>

#define CLASS_STR(__class__) \
({              \
    __class__ *x;\
    #__class__ ;\
})

int main(int argc, char* argv[]) {

    auto className = CLASS_STR(MyClass);

    std::cout << className << std::endl;

    return 0;
}

请注意,如果我将MyKlass传递给宏,它将无法初始化指针,所以现在我有一个编译时检查该类是否可用。检查后,我得到一个字符串,保证代表该类。

当然,可以轻松地重新定义发布版本的宏以执行字符串化。