我的代码中的版本号以几种格式定义,这要求我在版本升级时更改多个定义:
#define VERSION_N 0x0203
#define SERIALNUMBER_STR L"2.0.3"
等等。
我想将它集中到一个单一的定义。 类似的东西:
#define VER_X_ 0
#define VER_H_ 2
#define VER_M_ 0
#define VER_L_ 3
#define VERSION_N VER_L_ + 0x10*VER_M_ + 0x100*VER_H_ + 0x1000*VER_X_
#define SERIALNUMBER_STR ??????????????
答案 0 :(得分:1)
使用stringify宏:
#define STRINGIFY_1(x...) #x
#define STRINGIFY(x...) STRINGIFY_1(x)
#define VER_X_ 0
#define VER_H_ 2
#define VER_M_ 0
#define VER_L_ 3
#define SERIALNUMBER_STR STRINGIFY(VER_H_) L"." STRINGIFY(VER_M_) \
L"." STRINGIFY(VER_L_)
EDIT1:我在L
中添加了L"."
以获得广泛的字符串。我没有放置L#x
,因为它扩展了一个空格,L "string"
形式的东西不是C中的字符串文字。尽管如此,将字符串文字与宽字符串文字结果连接起来一个宽字符串文字。
EDIT2:如评论中所述,上面的示例适用于C(c99和c11)的最后修订,但不适用于c89(即不适用于MSVC)。第一个原因是c89不支持可变参数宏。第二个原因是在c99中你可以连接一个字符串文字和一个宽字符串文字,但在c89中这是未定义的行为。以下是一个标准解决方案,也适用于c89:
#define CAT(x, y) x##y
#define WIDE(x) CAT(L,x)
#define STRINGIFY_1(x) #x
#define STRINGIFY(x) STRINGIFY_1(x)
#define VER_X_ 0
#define VER_H_ 2
#define VER_M_ 0
#define VER_L_ 3
#define SERIALNUMBER_STR WIDE(STRINGIFY(VER_H_)) L"." WIDE(STRINGIFY(VER_M_)) \
L"." WIDE(STRINGIFY(VER_L_))
答案 1 :(得分:0)
以下是测试解决方案:
#define VER_X_ 0
#define VER_H_ 2
#define VER_M_ 0
#define VER_L_ 3
#define VERSION_N (VER_L_ + 0x10*VER_M_ + 0x100*VER_H_ + 0x1000*VER_X_)
// Device Strings
//
#define STRINGIFY_1(x) L#x
#define STRINGIFY(x) STRINGIFY_1(x)
#define PASTE(x, y) x##y
#define MAKEWIDE(x) PASTE(L,x)
#define SERIALNUMBER_STR MAKEWIDE(STRINGIFY(VER_H_)) L"." \
MAKEWIDE(STRINGIFY(VER_M_)) L"." \
MAKEWIDE(STRINGIFY(VER_L_))
感谢ouah
编辑: