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

Mos*_*sby 3 c c++ printf

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

    #ifdef LONG_IDX
    typedef long int idx_type
    #else
    typedef int idx_type
    #endif
Run Code Online (Sandbox Code Playgroud)

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

unw*_*ind 12

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

#ifdef LONG_IDX
typedef long long int idx_type
#define IDX_FORMAT "lld"
#else
typedef int idx_type
#define IDX_FORMAT "d"
#endif
Run Code Online (Sandbox Code Playgroud)

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

idx_type my_index = 47;

print("my_index = %" IDX_FORMAT, my_index);
Run Code Online (Sandbox Code Playgroud)

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

此外,如果您的编译器足够好以进行格式化字符串验证(GCC确实如此),如果您确实陷入困境并忘记在defined某处使用字符串,则很可能会收到有用的警告.


Ric*_*III 9

我会使用%lli(long long integer),并在打印时进行转换:

idx_type idx;

printf("%lli", (long long int) idx);
Run Code Online (Sandbox Code Playgroud)

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

  • 在这种情况下.一般的解决方案是使用`"%j"`并强制转换为`intmax_t`.(但是,当然,这是C++程序员没有的问题.) (2认同)