gno*_*ome 7 c++ c-preprocessor c++11
我正在为我公司的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是不支持.
这是我现在正在做的事情:
#define str(x) #x
#define xstr(x) str(x)
#include xstr(libwhatever.version.is.VERSION.should.be.3.1.4)
Run Code Online (Sandbox Code Playgroud)
除此之外,我还添加了一个名为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++。不过,我不确定该行为是否完全按照标准定义。
| 归档时间: |
|
| 查看次数: |
1313 次 |
| 最近记录: |