我正在为我公司的 C++ 项目添加编译时检查,以确保所有开发机器和构建服务器上的第三方库都是最新的。大多数图书馆定义如下内容,例如版本 3.1.4:
#define VERSION_MAJOR 3
#define VERSION_MINOR 1
#define VERSION_BUILD 4
使用 static_assert
或预处理器指令,这很容易检查。
现在我正在寻找一个定义单个宏的第三方库:
#define VERSION 3.1.4
如何在编译时验证此类宏的值?
使用 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");
但是我们在 Windows 机器上使用 Visual Studio 2013,所以我只能使用它支持的 C++11 子集。不幸的是 constexpr
不受支持。
最佳答案
这是我现在正在做的:
#define str(x) #x
#define xstr(x) str(x)
#include xstr(libwhatever.version.is.VERSION.should.be.3.1.4)
与此同时,我向项目添加了一个名为 libwhatever.version.is.3.1.4.should.be.3.1.4
的空文件。因此,如果版本正确,预处理器将成功包含此文件。否则,它将失败并显示“无法打开‘libwhatever.version.is.2.7.2.should.be.3.1.4’,没有这样的文件或目录”。构建失败并带有某种有意义的消息才是最终的决定因素。
当然这种方式不是很灵活;例如,我无法检查最小版本或一系列版本。但对我来说,能够检查确切的值就足够了。
这似乎适用于 Visual C++ 和 g++。不过,我不确定该行为是否完全符合标准。
关于c++ - 如何在编译时检查像 "#define VERSION 3.1.4"这样的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30925756/