#include <stdio.h>
#define Type int
int main()
{
Type x=3;
printf("%d",x);
return 0;
}
代码很简单,工作正常。我的问题是,如果我将#define Type int
更改为#define Type float
,那么我也必须将%d
更改为%f
。是否有任何方法可以使用通用说明符,它适用于所有int
,float
,char
,string
等......所以,如果我更改{{ 1}}然后我不必更改#define Type int
函数中的格式说明符?
答案 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
,因此没有理由不再使用它了。