使用字符串化宏:
#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中的字符串文字。儘管連接字符串和寬字符串會導致寬字符串文字。如上所述,上述示例使用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_))
您應該在宏體的周圍放置括號以防止由於擴展站點上的運算符優先級而導致的意外。即'2 * VERSION_N'會給你錯誤的結果,因爲'*'的優先級高於'+',所以它只會將'VER_L_'乘以'2'。 – pat
@pat有趣。應該放在最後的解決方案,儘管對我來說無關緊要。 TX。 – Shaul
誰開始迷戀宏名稱中的尾部下劃線? – Jens