带前导零的串化 < >我正在寻找一种方法,在编译时,在C++中有一个固定长度的设备名,作为字符串文字。< /P>
例如:带前导零的串化 < >我正在寻找一种方法,在编译时,在C++中有一个固定长度的设备名,作为字符串文字。< /P>,c++,c,preprocessor,C++,C,Preprocessor,例如: #define STR_HELPER(x) #x #define STR(x) STR_HELPER(x) #define VERSION 6 #define DEVICE_NAME "MyDevice" STR(VERSION) 带有前导零的固定长度以适合4位数字是我想要的输出,就像MyDevice0006一样,使用前面代码的实际输出是MyDevice6 我搜索并找到了这个: 有没有增强的代码可以做到这一点?非常难看,但这应该可以做到: #include <
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
#define VERSION 6
#define DEVICE_NAME "MyDevice" STR(VERSION)
带有前导零的固定长度以适合4位数字是我想要的输出,就像MyDevice0006一样,使用前面代码的实际输出是MyDevice6
我搜索并找到了这个:
有没有增强的代码可以做到这一点?非常难看,但这应该可以做到:
#include <stdio.h>
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
#define VERSION 6
#if (version < 10)
#define DEVICE_NAME "MyDevice000" STR(VERSION)
#elif (version < 100)
#define DEVICE_NAME "MyDevice00" STR(VERSION)
#elif (version < 1000)
#define DEVICE_NAME "MyDevice0" STR(VERSION)
#else
#define DEVICE_NAME "MyDevice" STR(VERSION)
#endif
int main(void)
{
puts(DEVICE_NAME);
}
非常难看,但这应该可以做到:
#include <stdio.h>
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
#define VERSION 6
#if (version < 10)
#define DEVICE_NAME "MyDevice000" STR(VERSION)
#elif (version < 100)
#define DEVICE_NAME "MyDevice00" STR(VERSION)
#elif (version < 1000)
#define DEVICE_NAME "MyDevice0" STR(VERSION)
#else
#define DEVICE_NAME "MyDevice" STR(VERSION)
#endif
int main(void)
{
puts(DEVICE_NAME);
}
在C++中为什么要标记C?C不是C++。在编译时预处理和C++中,不需要使用预处理。您希望在编译时有预处理器或C++中的特定操作吗?LIBFMT可能能够做到这一点,我知道它有一些CONTXPR支持,不确定它是否能处理这个CASECAN,您描述了您需要什么样的功能?根据这个细节,使用COSTEXPROPR是可能的,或者不解决问题,这更清楚,然后使用宏。C++有很多编译时能力。如今,有效的用例或宏极为罕见。请选择一种语言。如果使用预处理器是一项严格的要求,那么这并不重要,但这是一项奇怪的要求。我认为这个错误可以通过定义SMARTVER\u HELPER\u x 00 x来解决。但这不是一个好的解决方案,因为其他人在C++中为什么要标记C?C不是C++。在编译时预处理和C++中,不需要使用预处理。您希望在编译时有预处理器或C++中的特定操作吗?LIBFMT可能能够做到这一点,我知道它有一些CONTXPR支持,不确定它是否能处理这个CASECAN,您描述了您需要什么样的功能?根据这个细节,使用COSTEXPROPR是可能的,或者不解决问题,这更清楚,然后使用宏。C++有很多编译时能力。如今,有效的用例或宏极为罕见。请选择一种语言。如果使用预处理器是一项严格的要求,那么这并不重要,但这是一项奇怪的要求。我认为这个错误可以通过定义SMARTVER\u HELPER\u x 00 x来解决。但这并不是一个好的解决方案,正如其他人所说,这可以用一些三元运算符来概括,甚至像define DEVICE_NAMEversion@KamilCuk谢谢你指出这一点,但你能告诉我怎么做吗?如果您不能将sizeof与预处理器一起使用:,或者您的意思是在运行时?,似乎OP希望它在编译时工作。是的,这将在运行时进行计算,仍然由编译器进行优化。无论如何,这取决于用例。谢谢,它工作得很好。只需编辑版本以匹配定义的版本。你认为它很丑陋,你认为“整洁”的方式会有用吗?“HamzaHajeir有帮助吗?”这可以用一些三元运算符来概括,甚至像define DEVICE_NAMEversion@KamilCuk谢谢你指出这一点,但你能告诉我怎么做吗?如果您不能将sizeof与预处理器一起使用:,或者您的意思是在运行时?,似乎OP希望它在编译时工作。是的,这将在运行时进行计算,仍然由编译器进行优化。无论如何,这取决于用例。谢谢,它工作得很好。只需编辑版本以匹配定义的版本。你认为它很丑陋,你认为“整洁”的方式会有用吗?“HamzaHajeir有帮助吗?”
#include <stdio.h>
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
#define VERSION 6
#if (version < 10)
#define DEVICE_NAME "MyDevice000" STR(VERSION)
#elif (version < 100)
#define DEVICE_NAME "MyDevice00" STR(VERSION)
#elif (version < 1000)
#define DEVICE_NAME "MyDevice0" STR(VERSION)
#else
#define DEVICE_NAME "MyDevice" STR(VERSION)
#endif
int main(void)
{
puts(DEVICE_NAME);
}