字符串说明符(%d,%f等...)

时间:2012-08-02 19:29:29

标签: c specifier

#include <stdio.h>
#define Type int

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

}

代码很简单,工作正常。我的问题是,如果我将#define Type int更改为#define Type float,那么我也必须将%d更改为%f。是否有任何方法可以使用通用说明符,它适用于所有intfloatcharstring等......所以,如果我更改{{ 1}}然后我不必更改#define Type int函数中的格式说明符?

2 个答案:

答案 0 :(得分: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编译器会将它们自动合并为一个字符串常量。

P.S。您不应该使用#define作为类型,而应该使用typedef,如下所示:

typedef int TYPE;

这意味着在调试器中,您可以看到变量x的类型为TYPE,而使用#define时,您会看到它是类型int

在一个完美的世界中,你会声明格式字符串,如下所示:

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

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

摘要:使用typedef作为类型,但使用#define作为格式。

答案 1 :(得分:2)

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

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

然后将其用作

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

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