c宏十进制到字符串

c宏十进制到字符串,c,macros,c-preprocessor,C,Macros,C Preprocessor,结果=>tmp=>10+20 我怎样才能像下面这样改变它 tmp=>“30”正如您所注意到的,#操作符会将整个传递的宏参数转换为字符串,因此它没有多大帮助 因此,常识反而会鼓励以下代码: #define TMP4(x) #x #define TMP3(x) TMP4(x) const char tmp[] = TMP3(10+20); 如果这不是一个选项,那么您将不得不求助于非常丑陋和非常具体的预处理器技巧。例如: const char tmp[] = "30"; //

结果=>tmp=>10+20

我怎样才能像下面这样改变它

tmp=>“30”

正如您所注意到的,
#
操作符会将整个传递的宏参数转换为字符串,因此它没有多大帮助

因此,常识反而会鼓励以下代码:

#define TMP4(x) #x
#define TMP3(x) TMP4(x)

const char tmp[] = TMP3(10+20);
如果这不是一个选项,那么您将不得不求助于非常丑陋和非常具体的预处理器技巧。例如:

const char tmp[] = "30"; // 10+20
#包括
#定义ADDIFY(CH1,CH2)(CH1+CH2-'0')
#定义ADD#u STRINGIFY(a,b){ADDIFY(#a[0],#b[0]),ADDIFY(#a[1],#b[1]),'\0'}
内部主(空)
{
const char tmp[]=ADD_STRINGIFY(11,22);
看跌期权(tmp);
}

这是一个非常粗糙的版本,可以在许多方面加以改进。目前,它只适用于2个数字,每个数字正好有2位数长。它生成一个字符数组初始值设定项列表
#a[0]
给出字符串
“11”
中的第一个字符,如果将其与字符串
“22”
中的第一个字符相加,然后减去
'0'
,则得到的字符
'3'
就是不使用“stringify”操作符。@Gereon然后初始化
tmp
将不起作用。不,我认为这是不可能的。预处理器可以执行算术运算,但只能自己使用其结果(即与其他常量等进行比较)
#include <stdio.h>

#define ADDIFY(CH1, CH2) (CH1 + CH2 - '0')
#define ADD_STRINGIFY(a,b) { ADDIFY(#a[0], #b[0]), ADDIFY(#a[1], #b[1]), '\0' }

int main(void)
{
  const char tmp[] = ADD_STRINGIFY(11, 22);
  puts(tmp);
}