C预处理器 - 将定义用作整数和宽字符串

时间:2014-03-02 21:37:02

标签: c c-preprocessor stringification

我的代码中的版本号以几种格式定义,这要求我在版本升级时更改多个定义:

#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    ??????????????

2 个答案:

答案 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

编辑:

  1. 根据拍摄添加括号。
  2. Ouah的话被认真对待。适合MS的解决方案:添加了两个PASTE& MAKEWIDE