我一直在通过在不同平台上编译来对我的应用程序进行一些测试,而从64位系统向32位系统的转变暴露了许多问题.
我大量使用向量,字符串等,因此需要对它们进行计数.但是,我的函数也使用32位无符号数,因为在很多情况下我需要显式地使用正整数.
我遇到了看似简单的任务问题,例如std :: min和std :: max,这可能更系统化.请考虑以下代码:
uint32_t getmax() { return _vecContainer.size(); }
看起来很简单:我知道向量不能有负数的元素,所以返回无符号整数就完全有道理了.
void setRowCol(const uint32_t &r_row; const uint32_t &r_col) { myContainer_t mc; mc.row = r_row; mc.col = r_col; _vecContainer.push_back(mc); }
再次,简单.
问题:
uint32_t foo(const uint32_t &r_row) { return std::min(r_row,_vecContainer.size()); }
这给了我错误,例如:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:2589:1: note: candidate template ignored: deduced conflicting types for parameter '_Tp' ('unsigned long' vs. 'unsigned int') min(const _Tp& __a,const _Tp& __b)
我做了很多挖掘,在一个平台上,vector :: size_type是一个8字节的数字.但是,根据设计,我使用无符号的4字节数字.这可能会导致事情变得古怪,因为您无法隐式地将8字节数转换为4字节数.
解决方案是做老式的weay:
#define MIN_M(a,b) a < b ? a : b return MIN_M(r_row,_vecContainer.size());
花花公子.但系统性问题仍然存在:在规划多平台支持时,您如何处理这样的实例?我可以使用size_t作为我的标准大小,但这增加了其他复杂性(例如从支持64位数的一个平台移动到另一个支持32位数字的平台).更大的问题是size_t是无符号的,所以我无法更新我的签名:
size_t foo(const size_t &r_row) // bad,this allows -1 to be passed,which I don't want
有什么建议?
编辑:我读过size_t签名的地方,我已经纠正了.到目前为止看起来这是我自己设计的限制(例如32位数字与使用std :: vector :: size_type和/或size_t).