我想通过使用C语言根据库的版本(我无法更改值)来计算某些内容。
但是,我正在使用的库的版本通过使用#defines来定义为字符串:
/* major version */
#define MAJOR_VERSION "2"
/* minor version */
#define MINOR_VERSION "2"
然后,我的问题是:如何定义宏STR_TO_INT以便将字符串MINOR_VERSION和MAJOR_VERSION转换为整数?
#if ((STR_TO_INT(MAJOR_VERSION) == 2 && STR_TO_INT(MINOR_VERSION) >= 2) || (STR_TO_INT(MAJOR_VERSION > 2))
//I perform an action...
#else
//I perform a different action
#endif
我更喜欢将它定义为宏,因为我使用了这个库中的很多函数。请随时给我任何想法。
答案 0 :(得分:3)
预处理官方库标题libheader.h
,以生成更有用的信息,而不使用新标题libversion.h
中的引号:
sed -n -e '/^#define \(M[AI][JN]OR\)_VERSION "\([0-9][0-9]*\)".*/ {
s//#define NUM_\1_VERSION \2/p
}' libheader.h >libversion.h
您可能需要更灵活地在#
,define
和宏名称的不同部分周围添加空格和制表符。我还假设定义中没有注释(处理尾随注释):
/* This starts in column 1 - unlike the next line */
# define /* No comment here */ MAJOR_VERSION /* Nor here */ "2"
现在,您可以同时包含libheader.h
和libversion.h
,并将数字版本与有罪不罚现象进行比较(只要您获得正确的表达式):
#include "libheader.h"
#include "libversion.h"
#if ((NUM_MAJOR_VERSION == 2 && NUM_MINOR_VERSION >= 2) || NUM_MAJOR_VERSION > 2)
…perform the new action…
#else
…perform the old action…
#endif
严格来说,sed
脚本还会转换MIJOR_VERSION
和MANOR_VERSION
;但是,它们不太可能出现在库头中,您可以轻松忽略生成的数字版本。如果你真的认为这是一个实际的而不是假设的问题,有办法解决这个问题。
更严重的是,如果库对版本信息进行了复杂的控制,则可能是单个标题可以伪装成库的不同版本 - 可能有多行定义主要版本和次要版本。如果是这样的话,你必须更加努力。
答案 1 :(得分:0)
#define MAJOR_VERSION 2
可以在任何地方使用,作为int,就像你一样,2,不需要字符串/转换。你可以直接做:
if (MAJOR_VERSION == 2) { /* version 2 */ }
else { /* not version 2 */ }