我可以通过简单地搜索并用 long double
替换
double
来用 long 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]
最终目标是:
double
替换为 typedef double xnec2c_double_t
./configure --enable-long-double
中提供 configure.ac
选项,将 typedef 调整为 long double
。printf
和相关的基于格式说明符的函数(如 sprintf
等)。问题:
通过更改
double
来使格式说明符与 long double
与 typedef
的编译时选择配合使用的最佳实践是什么?
我可以在每个打印周围放置
#ifdef
,或者将#define SPEC_DOUBLE "%Lf"
和字符串连接为printf("foo=" SPEC_DOUBLE "\n", foo)
,但这看起来几乎和在每个#ifdef
周围添加printf
一样黑客。如果有一种优雅的方法来实现,那么 my_smart_printf
宏可能是一种选择,但我还没有想出一个。
有没有“好”的方法来做到这一点?
注意:
如何在不更改 C 中的格式说明符的情况下支持双精度和长双精度?
long double
并使用匹配的 long double
说明符,以便在所有情况下都可以使用相同的格式。printf("%Lf\n", (long double) float_or_double_or_long_double_object);
PRI...
中的 <inttypes.h>
示例,创建您自己的说明符,如 #define SPEC_DOUBLE "Lf"
中所示。注意没有"%"
。printf("%" SPEC_DOUBLE "\n", xnec2c_double_object);