我正在为我公司的C++项目添加编译时检查,以确保所有开发机器和构建服务器上的第三方库都是最新的.大多数库定义类似于以下内容的版本,例如版本3.1.4:
#define VERSION_MAJOR 3
#define VERSION_MINOR 1
#define VERSION_BUILD 4
Run Code Online (Sandbox Code Playgroud)
这很容易检查使用static_assert或预处理器指令.
现在我正在查看定义单个宏的第三方库:
#define VERSION 3.1.4
Run Code Online (Sandbox Code Playgroud)
如何在编译时验证这样一个宏的值?
使用C++ 11,我可以使用constexpr字符串比较函数,并将宏字符串化以检查它:
constexpr bool static_equal(const char * a, const char * b)
{
return (*a == *b) && (*a == '\0' || static_equal(a + 1, b + 1));
}
// stringification functions
#define str(x) #x
#define xstr(x) str(x)
static_assert(static_equal(xstr(VERSION), "3.1.4"), "incorrect version of libwhatever");
Run Code Online (Sandbox Code Playgroud)
但我们在Windows机器上使用Visual Studio 2013,因此我只能使用它支持的C++ 11子集.不幸的constexpr是不支持.