if
我在宏中有一个 typedef ,例如:
#ifdef BLA_BLA
typedef int typeA
#elseif
typedef double tyeA
#endif
printf("%d" , a); printf("%l" , a);
我想知道当我为这种情况编写 printf 时最好的方法是什么?(%d
或%l
)。
我知道我也可以在宏中定义一个固定的字符串。但这是最好的方法吗?
if
我在宏中有一个 typedef ,例如:
#ifdef BLA_BLA
typedef int typeA
#elseif
typedef double tyeA
#endif
printf("%d" , a); printf("%l" , a);
我想知道当我为这种情况编写 printf 时最好的方法是什么?(%d
或%l
)。
我知道我也可以在宏中定义一个固定的字符串。但这是最好的方法吗?
也可以使用宏来定义格式字符串。
#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);
您真的想将类型定义为整数或浮点数吗?它们都是数字的,但是它们的行为在很多方面都如此不同,以至于编写在任何一种情况下都能正常工作的代码都将变得很困难。
在许多情况下,您可以转换为足够宽以涵盖两种可能类型的范围的类型。一个简单的例子:
#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_t
or ,在oruintmax_t
中定义,使用or 。<stdint.h>
<inttypes.h>
"%jd"
"%ju"
您几乎可以通过将所有内容转换为 来做同样的事情long double
,但是对于大整数值,这可能会失去精度。
如果是我,我不会直接将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 的原因之一,顺便说一句;如果表示很重要(例如在这种情况下),那么您真的不想向使用它的人隐藏该信息。
还有另一种选择 - 定义一个简短的辅助函数,这样您就不必在整个代码中到处使用 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);
}