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

Bor*_*w37 4 c stringification c-preprocessor

我已经看过这个主题,通过这样做来描述"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)
Run Code Online (Sandbox Code Playgroud)

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

#define MAJOR_VER 02
#define MINOR_VER 0006
Run Code Online (Sandbox Code Playgroud)

这些值将被视为应用程序中其他位置的八进制,这是我不想要的.

Giu*_*ini 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)
Run Code Online (Sandbox Code Playgroud)

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

#undef VER
#define VER ...your version number...
#include "smartver.h"
Run Code Online (Sandbox Code Playgroud)

此时,表达式RESVER(VER)被扩展为一个四位数的字符序列,表达式STR(RESVER(VER))是等效的字符串(注意:我已经使用了你在答案中发布的STR宏).

前面的代码与您的示例中的次要版本的情况相匹配,修改它以匹配"主要版本"情况是微不足道的.但实际上我会使用一个简单的外部工具来生成所需的字符串.