0
#include <stdio.h>

#define stringify(s)    tostring(s)
#define tostring(s)     #s

#define MAX_VALUE 65536
#define NUM 64 * 1024

enum {
    MIN_VALUE = 1024,
};

int main(int argc, char *argv[])
{
    const char *max_str = stringify(MAX_VALUE);
    const char *min_str = stringify(MIN_VALUE);
    printf("max = %s, min = %s\n", max_str, min_str);
    return 0;
}

输出为 "max = 65536, min = MIN_VALUE num = 1024 * 64" 专家,我怎样才能修改我的代码输出如下:max = 65536, min = 1024 num = 65536

谢谢 。

4

3 回答 3

3

MIN_VALUE 是一个数字。为什么需要对其进行字符串化?

只需使用:

printf("%d\n", MIN_VALUE);
于 2013-01-24T06:03:09.063 回答
0

#define语句在编译器查看代码之前由预处理器处理,因此它基本上是文本替换(实际上使用参数等更智能)。

由于stringify(s)is #defined,预处理器忠实地完成了它的工作。

stringify(MAX_VALUE)衰减到,stringify(65536)因为 MAX_VALUE 是 #defined to 65536,在预处理时也知道。

但是Enumerations是 C 语言本身的一部分,在预处理时并不为人所知,因此,stringify(MIN_VALUE)保留为 stringify(MIN_VALUE),因此toString(MIN_VALUE)

进行整数运算或打印

num = 65536

“是的”,有一种方法可以让预处理器执行整数运算,即在preprocessor条件中使用它。

#if 1024*64 == 65536
    printf("num=65536\n");
#endif
于 2013-01-24T07:26:20.630 回答
0

我认为你最好使用函数而不是宏,原因是宏甚至在编译时才被扩展,更不用说运行时了。

考虑这个例子:

#define stringify(V) #V

#include <stdio.h>

int main()
{
    int x = 5;
    const char *str = stringify(x);
    printf("%s\n", str);
}

预处理器完成工作后,代码将如下所示:

#include <stdio.h>

int main()
{
    int x = 5;
    const char *str = "x";
    printf("%s\n", str);
}

那是因为所有预处理器指令#所做的就是将给定的参数用引号括起来。

如果您想要一个适用于常量、枚举(强制转换为 int)和整数变量的字符串行为,您可以使用sprintf

#include <stdio.h>
#include <stdlib.h>

char *stringify(int x)
{
    /* get the length of the required buffer */
    int len = snprintf(0, 0, "%i", x);
    /* allocate memory */
    char *res = malloc(sizeof(char) * (len + 1));
    /* handle allocation failure */
    if(!res)
        return 0;

    /* convert the int to string */
    snprintf(res, len + 1, "%i", x);

    /* return the result */
    return res;
}

int main()
{
    int x = 5;
    char *str = stringify(x);
    printf("%s\n", str);
    /* we free the memory allocated by malloc */
    free(str);
}

这将是您在 C 中实现此目的的一种方法。如果您想了解更多关于我使用的函数的信息,请查看:

于 2013-01-24T06:27:33.537 回答