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

标签 c++ c printf

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

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

我的代码中有一些 printf 语句来打印出该索引数据,我不想将它们到处都包裹在 #ifdef 语句中。是否有格式标志指定参数可以是 long intint?如果没有,有没有办法定义一个自定义格式标志,我可以简单地将其添加到我的索引类型定义中?

最佳答案

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

#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 字符串,您很可能会收到有用的警告。

关于c++ - 有没有办法用相同的格式标志打印 long int 和 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9703254/

相关文章:

c++ - 如何在无限循环的游戏中防止堆栈溢出?

c++ - 为我的 C++ 静态库创建接口(interface)

c - 动态结构

c - 恢复 Lua 线程(协程)时如何处理错误

使用 snprintf 复制数组中的字符

c - printf 为 float 指定整数格式字符串

c++ - 我如何更改 c plus 中分配的类值

c++ - tuple - get_or 辅助函数

c - 瓦尔格林德+C : conditional jump or move depends on uninitialised value(s)

c++ - 为什么 PRIu64 在此代码中不起作用?