使用#define将值转换为字符串

时间:2013-02-01 15:37:46

标签: c c-preprocessor

我的任务是将浮点数或整数值转换为 C 中的字符串。我不能使用sprintf,因为我在嵌入式平台上工作。所以我想用这样的东西。

#define CURRENT(STRING,S_NO,VALUE) (str = "S"#S_NO#VALUE"A") 

并像这样调用它

int a=10,b=20;
CURRENT(str,a,b);

所以str应该是S1020A。但是我得到了SabA

我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

在编译之前评估宏,以便使用变量名CURRENT(str,a,b);a扩展b,而不是它们的值,这些值可能只在运行时可用。

要在运行时将int转换为char数组,而不使用sprintf等。如果可用,请使用itoa,或者您可以编写如下函数(未经测试) !)

#define MAX_INT_STRING_BYTES (11)

void IntToString(int val, char* str)
{
    char reversed[MAX_INT_STRING_BYTES]
    int index, i = 0;
    bool negative = false;
    if (val == 0) {
        *str++ = '0';
        *str = '\0';
        return;
    }
    if (val < 0) {
        negative = true;
    }
    while(val != 0) {
        reversed[index++] = (char)('0' + abs(val % 10));
        val /= 10;
    }
    if (negative) {
        *str++ = '-';
    }
    for (i = index; i > 0; i--) {
        *str++ = reversed[i - 1]);
    }
    *str = '\0';
}

答案 1 :(得分:2)

它只知道a和b在运行时的值,并且在编译时解析预处理器指令。因此,您尝试做的事情将无法奏效。

但你可以这样做:

#define CURRENT(STRING,S_NO,VALUE) sprintf(STRING, "S%i%iA", S_NO, VALUE)

或者只是让它成为一种功能。

或者直接调用sprintf而不是CURRENT。