有没有办法用相同的格式标志打印long int和int?

时间:2012-03-14 13:48:12

标签: c++ c printf

我有一个定义索引类型的代码,这样如果用户知道他们的索引空间保持在普通整数的范围内,他们可以使用int而不是long int

    #ifdef LONG_IDX
    typedef long int idx_type
    #else
    typedef int idx_type
    #endif

我的代码中有一些printf语句用于打印出这个索引数据,我不希望将它们包装在#ifdef语句中。是否有格式标志来指定参数可以是long int还是int?如果没有,有没有办法定义一个我可以简单地添加到我的索引类型定义的自定义格式标志?

4 个答案:

答案 0 :(得分:12)

您可以有条件地为索引类型定义格式化程序:

#ifdef LONG_IDX
typedef long long int idx_type
#define IDX_FORMAT "lld"
#else
typedef int idx_type
#define IDX_FORMAT "d"
#endif

然后你当然需要在格式化调用中使用它,这可能会变得有点麻烦(并且一如既往!)要求你保持警惕并记住在你想要打印索引时正确执行:

idx_type my_index = 47;

print("my_index = %" IDX_FORMAT, my_index);

注意上面如何使用C的相邻字符串文字的自动连接来在编译时“构建”正确的格式化字符串。这是C语法的一个很棒的特性的典型用法。

另外,如果你的编译器足够好来进行格式化字符串验证(GCC会这样做),如果你搞砸了并忘记在某处使用defined字符串,你很可能会得到有用的警告。

答案 1 :(得分:9)

我会使用%lli(长整数),并在打印时进行转换:

idx_type idx;

printf("%lli", (long long int) idx);

我认为这将为您提供最可靠的印刷品。

答案 2 :(得分:2)

最简单的方法是始终施放“向上”。

#include <stdio.h>

int main(void)
{
    char c = 1;
    int i = 12;
    long int l = 123;
    long long int ll = 1234;

    printf("c=%lld i=%lld l=%lld ll=%lld\n", 
            (long long int) c, 
            (long long int) i, 
            (long long int) l, 
            (long long int) ll
          );
    return 0;
}

答案 3 :(得分:-3)

在printf或%d打印中使用std::cout表示小数。