如何使用/将宏中定义的字符串转换为整数?

时间:2016-02-02 01:20:22

标签: c string macros int

我想通过使用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

我更喜欢将它定义为宏,因为我使用了这个库中的很多函数。请随时给我任何想法。

2 个答案:

答案 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.hlibversion.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_VERSIONMANOR_VERSION;但是,它们不太可能出现在库头中,您可以轻松忽略生成的数字版本。如果你真的认为这是一个实际的而不是假设的问题,有办法解决这个问题。

更严重的是,如果库对版本信息进行了复杂的控制,则可能是单个标题可以伪装成库的不同版本 - 可能有多行定义主要版本和次要版本。如果是这样的话,你必须更加努力。

答案 1 :(得分:0)

#define MAJOR_VERSION 2可以在任何地方使用,作为int,就像你一样,2,不需要字符串/转换。你可以直接做:

if (MAJOR_VERSION == 2) { /* version 2 */ }

else { /* not version 2 */ }