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

C++ compile-time class name string with validation

本文关键字:字符串 编译 C++ 验证      更新时间:2023-10-16

我想要一种在编译时从类中获取字符串的方法,但如果该类不在作用域中,我也想要一个错误,所以这还不够:

#define CLASS_STR(c) # c

我想我可以写一个构建后的脚本作为某种静态分析器

一个例子是libextobjc中的密钥路径检查http://devetc.org/code/2014/05/17/safe-and-sane-key-paths.html

它应该很容易掌握,真的。与其写"MyClass",不如使用一个可以在字符串中返回类名的宏,同时确保该类在作用域中可见。

这里有一种方法:

#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传递给宏,它将无法初始化指针,所以现在我在编译时检查该类是否可用。检查之后,我得到一个字符串,它保证表示该类。

当然,可以很容易地为发布版本重新定义宏,以执行字符串化。