编译器宏来测试uint64_t和unsigned long long int之间的区别

时间:2014-10-22 05:03:41

标签: c++ c++11 macros uint64 unsigned-long-long-int

我的C ++ 11代码无法编译,因为使用与参数相同的类型重新定义了重载函数:

char const* foo(uint64_t) { return "%" PRIu64; }
char const* foo(unsigned long long int) { return "%llu"; }

我是否可以添加一个编译器宏来检查这两个原语之间的相等性,然后在编译之前删除第二个(如果它是等效的)?

还有其他函数返回其他类型的字符指针。例如,即使signedunsigned long long int使用相同的字节数,添加它也不会给我带来任何麻烦:

char const* foo(long long int) { return "%lld"; }

所以似乎不足以检查一个类型使用多少内存。还有什么方法?

1 个答案:

答案 0 :(得分:2)

您可以使用climitscstdint中的定义检查这些类型的最大值:

#include <climits>
#include <cstdint>

char const* foo(uint64_t) { return "%" PRIu64; }

//ULLONG_MAX defined in climits, UINT64_MAX in cstdint
#if ULLONG_MAX != UINT64_MAX

char const* foo(unsigned long long int) { return "%llu"; }

#endif

然而,使用模板创建系统可能是一个更好的长期解决方案。