c++ - 如何在编译时检查像 "#define VERSION 3.1.4"这样的值?

标签 c++ c++11 c-preprocessor

我正在为我公司的 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/

相关文章:

c++ - 性能:C++ 中的指针取消引用

C++11 最佳实践 : When to accept by value vs const&?

c# - 编译到不同的目标时,如何临时用另一种原始类型替换一种原始类型?

c - 宏存储在哪里?

c++ - 当预处理器看到 SLOT(a) "1"#a 时会发生什么

c++ - CUDA内核代码中矩阵的多次乘法

c++ - friend 功能在这里得到继承吗?

c++ - Boost::Future 延迟延续展开死锁

C++:istream如何在条件表达式中转换为bool

c++ - 静态指针对函数的 undefined reference