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

问题描述 投票:0回答:1

我可以通过简单地搜索并用 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]

最终目标是:

  1. 将所有
    double
    替换为
    typedef double xnec2c_double_t
  2. ./configure --enable-long-double
    中提供
    configure.ac
    选项,将 typedef 调整为
    long double
  3. 不会破坏
    printf
    和相关的基于格式说明符的函数(如
    sprintf
    等)。

问题:

通过更改

double
来使格式说明符与
long double
typedef
的编译时选择配合使用的最佳实践是什么?

我可以在每个打印周围放置

#ifdef
,或者将
#define SPEC_DOUBLE "%Lf"
和字符串连接为
printf("foo=" SPEC_DOUBLE "\n", foo)
,但这看起来几乎和在每个
#ifdef
周围添加
printf
一样黑客。如果有一种优雅的方法来实现,那么
my_smart_printf
宏可能是一种选择,但我还没有想出一个。

有没有“好”的方法来做到这一点?

注意:

  • 我不想切换到 C++
  • 这个问题与 autoconf 无关。
  • 我是 xnec2c 维护者。
c floating-point printf double format-string
1个回答
0
投票

如何在不更改 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);
© www.soinside.com 2019 - 2024. All rights reserved.