C预处理器:用前导零字符串化int?

时间:2015-02-17 21:35:05

标签: c c-preprocessor stringification

我看过this topic,其中描述了" stringify"通过以下方式进行操作:

#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" STR(MAJOR_VER) STR(MINOR_VER)

是否可以使用前导零进行字符串化?让我们说我的MAJOR_REV需要是两个角色" 02"在这种情况下,MINOR_REV 4个字符" 0006" 如果我这样做:

#define MAJOR_VER 02
#define MINOR_VER 0006

在应用程序的其他地方,这些值将被视为八进制,这是我不想要的。

2 个答案:

答案 0 :(得分:6)

没有干净或方便的方法。同样是一个挑战,这里有一个可能的解决方案":

1)创建一个头文件(例如" smartver.h"),其中包含:

#undef SMARTVER_HELPER_
#undef RESVER
#if VER < 10
#define SMARTVER_HELPER_(x) 000 ## x
#elif VER < 100
#define SMARTVER_HELPER_(x) 00 ## x
#elif VER < 1000
#define SMARTVER_HELPER_(x) 0 ## x
#else
#define SMARTVER_HELPER_(x) x
#endif
#define RESVER(x) SMARTVER_HELPER_(x)

2)在您的源代码中,无论您需要带有前导零的版本号:

#undef VER
#define VER ...your version number...
#include "smartver.h"

此时,表达式RESVER(VER)被扩展为四位数的字符序列,而表达式STR(RESVER(VER))是等效的字符串(注意:我使用了你发布在你身上的STR宏回答)。

前面的代码与您的示例中的次要版本的情况相匹配,修改它以匹配&#34;主要版本&#34;案件。但实际上我会使用一个简单的外部工具来生成所需的字符串。

答案 1 :(得分:0)

我相信sprintf提供的例子是正确的答案。

也就是说,有一些实际上你真的想要这样做,如果有一个遗嘱和一个愚蠢的人来编写代码那么通常有一种方法可以使用C预处理器。

我写了宏FORMAT_3_ZERO(a),它使用强力创建一个三位数的零填充数字。它位于https://gist.github.com/lod/cd4c710053e0aeb67281158bfe85aeef的文件preprocessor_format_zero.h中,因为它太大而且难以内联。

使用示例

#include "preprocessor_format_zero.h"

#define CONCAT_(a,b) a#b
#define CONCAT(a,b) CONCAT_(a,b)

#define CUSTOM_PACK(a) cp_ ## a __attribute__( \
        (section(CONCAT(".cpack.", FORMAT_3_ZERO(a))), \
        aligned(1), used))

const int CUSTOM_PACK(23);