2
#include <stdio.h>
#define Type int

int main()
{
        Type x=3;
        printf("%d",x);
        return 0;

}

代码很简单,工作正常。我的问题是,如果我更改 #define Type int#define Type floatso ,我也必须更改%d%f。有没有办法拥有一个通用的说明符,它适用于所有int, float, char,string等等......所以,如果我改变了,#define Type int那么我不必在printf()函数中更改格式说明符?

4

2 回答 2

5

这就是我的建议:

#include <stdio.h>

#define TYPE int
#define TYPE_FORMAT "%d"

int main()
{
    TYPE x=3;
    printf("Value of x is: " TYPE_FORMAT "\n", x);
    return 0;
}

在 C中无法printf()自动检测类型。在 C++ 中,您可以使用重载<<运算符,它自动识别类型,但 C 没有这样的功能。

但是您可以#define使用格式和类型,并且如果您将多个字符串文字彼此相邻放置,C 编译器会将它们自动合并为单个字符串常量。

PS 而不是使用#define类型,你应该typedef像这样使用:

typedef int TYPE;

这意味着在调试器中,你可以看到你的变量x是 type TYPE,而#define你会看到它是 type int

在一个完美的世界里,你会像这样声明格式字符串:

static char const * const TYPE_FORMAT = "%d";

但我们并不生活在一个完美的世界中。如果您对 进行上述声明TYPE_FORMAT,编译器可能不够聪明,无法将字符串与其他字符串文字合并。(我用 GCC 尝试过,正如我所料,我收到了一条错误消息。)所以TYPE_FORMAT你绝对应该使用#define。

总结:使用typedeffor 类型但使用#definefor 格式。

于 2012-08-02T19:40:01.270 回答
2

使用新的 C 标准 C11,您可以使用像这样的类型泛型表达式

#define MYFORMAT(X) \
_Generic(+(X)       \
   int: "%d",       \
   float: "%g",     \
   double: "%g",    \
   ... whatever ... \
)

然后将其用作

printf("the value is " MYFORMAT(x), x);

最新版本的 clang 编译器_Generic已经实现,所以没有理由不再使用它。

于 2012-08-02T20:18:53.163 回答