我能够用long double‘S通过简单的搜索--用long double代替double--编译出xnec2c个.它可以正确计算,但使用格式说明符的地方除外,因为它需要%Lf...当然,GCC在用这句俏皮话破解了它之后,对-Wformat=大喊大叫:

perl -p -i -e 's/_Complex/complex/g; s/gdouble/double/g; s/([ \t(]|^)double/$1long double/g' src/*.[ch]

最终目标是:

  1. typedef double xnec2c_double_t代替所有的double岁的S
  2. configure.ac中提供一个./configure --enable-long-double选项,将tyecif调整为long double.
  3. 不破百的S和相关的基于格式说明符的函数(如sprintf等).

Question:

让格式说明符在编译时 Select doublevslong double的情况下工作的最佳实践是什么?

我可以在每一张输出周围加上#ifdef英寸的S,或者将#define SPEC_DOUBLE "%Lf"和串连在一起的字符串连为printf("foo=" SPEC_DOUBLE "\n", foo),但这似乎几乎和每printf张左右加上#ifdef英寸的S一样离谱.如果有一个优雅的方法,my_smart_printf宏可能是一个 Select ,但我还没有想出一个.

有什么"好"的方法可以做到这一点吗?

请注意:(用谷歌翻译翻译)

  • 我不想切换到C++.
  • 这个问题不是关于汽车会议的.
  • 我是xnec2c的维护者.

推荐答案

如何在不更改C中的格式说明符的情况下同时支持双精度和长双精度?

  • 将浮点参数转换为long double并使用匹配的long double说明符,以便在所有情况下都可以使用相同的格式.

    printf("%Lf\n", (long double) float_or_double_or_long_double_object);
    
  • 遵循<inttypes.h>中的PRI...示例,并创建您自己的说明符,如#define SPEC_DOUBLE "Lf"中所示.注意:编号"%".

    printf("%" SPEC_DOUBLE "\n", xnec2c_double_object);
    
  • 创建一个帮助器函数,将特殊浮点数转换为string.

    extern char *xnec2c_to_str(char *dest, xnec2c_double_t x);
    //                     -        digits           .  frac  \0 
    #define xnec2c_STR_SZ (1 + (LDBL_MAX_10_EXP+1) + 1 + 6 + 1)
    #define xnec2c_TO_STR(x) (xnec2c_to_str((char[xnec2c_STR_SZ]){ 0 }, x)
    printf("%s\n", xnec2c_TO_STR(x));
    
  • And now for something completely different,考虑一下Formatted print without the need to specify type matching specifiers.

C++相关问答推荐

Apple Libm的罪恶功能

C指针地址和转换

括号中的堆栈实现错误问题

为什么在C中二维字符数组会有这样的行为?

如何使用低级C++写出数值

Char变量如何在不使用方括号或花括号的情况下存储字符串,以及它如何迭代到下一个字符?

为什么我的Hello World EFI程序构建不正确?

RawMotion的XInput2错误(具有较高值的XISelectEvents上的BadValue)

C I/O:在Windows控制台上处理键盘输入

-Wnonnull-Compare警告不是具有误导性吗?

Fprintf正在写入多个 struct 成员,并且数据过剩

有没有办法减少C语言中线程的堆大小?

C中的char**v*char[]

可以对两种 struct 类型中的任何一种进行操作的C函数

如何不断地用C读取文件?

指向返回 struct 成员的指针,安全吗?

为什么孤儿进程在 Linux 中没有被 PID 1 采用,就像我读过的一本书中声称的那样?

为什么 Linux 共享库 .so 在内存中可能比在磁盘上大?

如何在 C 中的 Postgres 函数的表中 for 循环

C语言程序流程解释