c – 如何在编译时检查“#define VERSION 3.1.4”之类的值?

c – 如何在编译时检查“#define VERSION 3.1.4”之类的值?,第1张

概述我正在为我公司的C项目添加编译检查,以确保所有开发机器和构建服务器上的第三方库都是最新的.大多数库定义如下的内容,例如:版本3.1.4: #define VERSION_MAJOR 3#define VERSION_MINOR 1#define VERSION_BUILD 4 使用static_assert或预处理程序指令很容易检查. 现在我正在查看定义单个宏的第三方库: #define V 我正在为我公司的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 == '
#define str(x) #x#define xstr(x) str(x)#include xstr(libwhatever.version.is.VERSION.should.be.3.1.4)
' || 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不受支持.

解决方法 这是我现在正在做的事情:

与此同时,我将一个名为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”之类的值?全部内容,希望文章能够帮你解决c – 如何在编译时检查“#define VERSION 3.1.4”之类的值?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1240293.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存