Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带前导零的串化 < >我正在寻找一种方法,在编译时,在C++中有一个固定长度的设备名,作为字符串文字。< /P>_C++_C_Preprocessor - Fatal编程技术网

带前导零的串化 < >我正在寻找一种方法,在编译时,在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);
}