我有一个LLU
用作 uint64 文字后缀的库。
Visual Studio 2010(在 windows7-64 上)抱怨“数字后缀错误”,修补库以使用LL
作品。是否有一些预处理器定义或属性复选框我必须设置为启用LLU
?
ps有人知道哪个是正确的行为吗?我一直认为 VC++ 所做的一切都与标准相反——但最近情况有所改善。
我有一个LLU
用作 uint64 文字后缀的库。
Visual Studio 2010(在 windows7-64 上)抱怨“数字后缀错误”,修补库以使用LL
作品。是否有一些预处理器定义或属性复选框我必须设置为启用LLU
?
ps有人知道哪个是正确的行为吗?我一直认为 VC++ 所做的一切都与标准相反——但最近情况有所改善。
查看我可用的标准(仅草稿,但相当新的版本),C++ 和 C 都将“ULL”和“LLU”定义为整数文字的有效后缀。这可能是 VS2010 没有遵循的最近更改,但我注意到 VS2012 做了完全相同的事情(即只有 ULL 有效)。
使用有符号和无符号文字是有区别的,这就是 MSVC 在您右移有符号值时的行为。有符号文字将被符号扩展,但无符号文字将用零填充。
换句话说,下面这个人为的例子:
unsigned long long l2 = ~0LL >> 5;
unsigned long long l3 = ~0ULL >> 5;
...将在 MSVC 下产生两个不同的值。
因此,如果您的库期望通过规定无符号值来定义行为,那么将它们转换为无符号值可能会导致未定义的行为。
简而言之,我认为 MSVC 只接受一种形式的后缀有点顽皮,但最好的解决方法是切换“U”出现的位置,而不是完全删除它。