float_t和double_t格式说明符

Cac*_*ito 5 c floating-point c99 math.h format-specifiers

对于intN_t类型,有新的格式说明符,例如%"PRIiN"and和%"SCNiN"for printf以及scanf函数族。

float_t和的新格式说明符是什么(如果有)double_t?(在中定义math.h

我可以-safely-使用%f%lf?我不这么认为,因为float_t它至少与一样大float,但可以定义为long double

由于没有人回答,而且我在任何地方都找不到答案,这可能是C语言中的错误吗?

Cac*_*ito 0

这些在标准中不存在,因此您必须自己使用它们来定义它们FLT_EVAL_METHOD(C11 7.12.2)。

我将分享我在库中为此编写的代码:

#if (FLT_EVAL_METHOD == 0)
#define PRIaFLT     "a"
#define PRIAFLT     "A"
#define PRIeFLT     "e"
#define PRIEFLT     "E"
#define PRIfFLT     "f"
#define PRIFFLT     "F"
#define PRIgFLT     "g"
#define PRIGFLT     "G"

#define SCNaFLT     "a"
#define SCNeFLT     "e"
#define SCNfFLT     "f"
#define SCNgFLT     "g"

#define PRIaDBL     "la"
#define PRIADBL     "lA"
#define PRIeDBL     "le"
#define PRIEDBL     "lE"
#define PRIfDBL     "lf"
#define PRIFDBL     "lF"
#define PRIgDBL     "lg"
#define PRIGDBL     "lG"

#define SCNaDBL     "la"
#define SCNeDBL     "le"
#define SCNfDBL     "lf"
#define SCNgDBL     "lg"


#elif   (FLT_EVAL_METHOD == 1)
#define PRIaFLT     "la"
#define PRIAFLT     "lA"
#define PRIeFLT     "le"
#define PRIEFLT     "lE"
#define PRIfFLT     "lf"
#define PRIFFLT     "lF"
#define PRIgFLT     "lg"
#define PRIGFLT     "lG"

#define SCNaFLT     "la"
#define SCNeFLT     "le"
#define SCNfFLT     "lf"
#define SCNgFLT     "lg"

#define PRIaDBL     "la"
#define PRIADBL     "lA"
#define PRIeDBL     "le"
#define PRIEDBL     "lE"
#define PRIfDBL     "lf"
#define PRIFDBL     "lF"
#define PRIgDBL     "lg"
#define PRIGDBL     "lG"

#define SCNaDBL     "la"
#define SCNeDBL     "le"
#define SCNfDBL     "lf"
#define SCNgDBL     "lg"


#elif   (FLT_EVAL_METHOD == 2)
#define PRIaFLT     "La"
#define PRIAFLT     "LA"
#define PRIeFLT     "Le"
#define PRIEFLT     "LE"
#define PRIfFLT     "Lf"
#define PRIFFLT     "LF"
#define PRIgFLT     "Lg"
#define PRIGFLT     "LG"

#define SCNaFLT     "La"
#define SCNeFLT     "Le"
#define SCNfFLT     "Lf"
#define SCNgFLT     "Lg"

#define PRIaDBL     "La"
#define PRIADBL     "LA"
#define PRIeDBL     "Le"
#define PRIEDBL     "LE"
#define PRIfDBL     "Lf"
#define PRIFDBL     "LF"
#define PRIgDBL     "Lg"
#define PRIGDBL     "LG"

#define SCNaDBL     "La"
#define SCNeDBL     "Le"
#define SCNfDBL     "Lf"
#define SCNgDBL     "Lg"
#endif
Run Code Online (Sandbox Code Playgroud)

然后你应该能够做到:

double_t    x;

scanf(" %"SCNaDBL"", &x);
printf("x = %"PRIaDBL"\n", x);
Run Code Online (Sandbox Code Playgroud)