1

if我在宏中有一个 typedef ,例如:

#ifdef BLA_BLA
typedef int typeA
#elseif 
typedef double tyeA
#endif
printf("%d" , a); printf("%l" , a);

我想知道当我为这种情况编写 printf 时最好的方法是什么?(%d%l)。

我知道我也可以在宏中定义一个固定的字符串。但这是最好的方法吗?

4

4 回答 4

7

也可以使用宏来定义格式字符串。

#ifdef BLA_BLA
typedef int typeA;
#define FORMAT "%d"
#elseif 
typedef double typeA;
#define FORMAT "%f"
#endif

...
typeA a = ...;
printf("Hello " FORMAT " there", a); printf(FORMAT , a);
于 2012-05-17T19:11:28.890 回答
2

您真的想将类型定义为整数或浮点数吗?它们都是数字的,但是它们的行为在很多方面都如此不同,以至于编写在任何一种情况下都能正常工作的代码都将变得很困难。

在许多情况下,您可以转换为足够宽以涵盖两种可能类型的范围的类型。一个简单的例子:

#include <stdio.h>

#ifdef BLA_BLA
typedef int num_type;
#else
typedef long num_type;
#endif

int main(void) {
    num_type x = 42;
    printf("x = %ld\n", (long)x);
    return 0;
}

更一般地,您可以分别转换为intmax_tor ,在oruintmax_t中定义,使用or 。<stdint.h><inttypes.h>"%jd""%ju"

几乎可以通过将所有内容转换为 来做同样的事情long double,但是对于大整数值,这可能会失去精度。

于 2012-05-17T21:01:51.840 回答
0

如果是我,我不会直接将typeA参数传递给printf;我将创建另一个返回值的字符串表示形式的typeA函数,并将该字符串传递给printf(或显示它所需的任何其他函数)。

char *formatTypeA(typeA val, char *buf, size_t len)
{
  #ifdef BLA_BLA
  #define FORMATCHAR d
  #else
  #define FORMATCHAR f
  #endif

  char formatStr[SIZE]; // where SIZE is large enough to handle the longest
                        // possible size_t value plus "%" plus the format
                        // character plus the 0 terminator
  sprintf(formatStr, "%%%zu" FORMATCHAR, len - 1); 
  sprintf(buf, formatStr, val);
  return buf;
}

int main(void)
{
  typeA foo;
  char output[10];
  ...
  printf("foo = %s\n", formatTypeA(foo, output, sizeof output));
  ...
}

可能有更好的方法来做到这一点。

编辑

这是我倾向于不经常使用 typedef 的原因之一,顺便说一句;如果表示很重要(例如在这种情况下),那么您真的不想向使用它的人隐藏该信息。

于 2012-05-17T21:08:00.283 回答
-1

还有另一种选择 - 定义一个简短的辅助函数,这样您就不必在整个代码中到处使用 ifdef:

#ifdef BLA_BLA
typedef int typeA
#else
typedef double typeA
#endif

inline void print_typeA(const typeA val) {
#ifdef BLA_BLA 
  printf("%d" , val); 
#else
  printf("%e" , val);
#endif
}

somefunc()
{ typeA xyz;

  print_typeA(xyz);
}
于 2012-05-17T20:53:37.810 回答