我将代码从Windows迁移到Linux。没有名为" __ int64"的类型。在Linux上,所以我尝试用别名自己定义它。我的代码如下:
#include <cstdint>
#if !defined(__int64)
typedef int64_t __int64;
#endif
int main(int argc, char** argv)
{
unsigned __int64 ii64 = 0; // Error
return 0;
};
当我编译它时,我收到以下错误:
main.cpp:在函数'int main(int,char **)'中:main.cpp:10:20:错误: 在'ii64'之前的预期初始化程序
我知道我可以替换&#34; unsigned __int64&#34;与&#34; uint64_t&#34;或定义一个新类型,但为什么不能编译前面的代码?
答案 0 :(得分:4)
见标准7.1.6 / 2:
作为一般规则,最多允许一个类型说明符 完整的decl-specifier-seq声明或在 type-specifier-seq或trailing-type-specifier-seq。唯一的例外 遵守此规则如下:
signed或unsigned可以与char,long,short或int结合使用。
请注意,这并不意味着unsigned可以与最终可能是其中一种类型的typedef结合使用,它只能直接与其他类型结合使用。
此外,请记住__int64
是为编译器保留的,因此自己定义它在技术上是非法的。您最好使用标准int64_t
和uint64_t
类型。
答案 1 :(得分:2)
因为typedef不是宏。这是一种新型!而且你不能构造这样的类型。
当您说unsigned int
时,它与const int
的语义不同。 const
是所谓的类型限定符。这意味着,它没有指定新类型,而是向现有类型添加了一些属性。但是,unsigned
不是类型的quialifier。 unsigned int
是它自己的类型。
答案 2 :(得分:0)
首先,“unsigned int”是一种类型,但“unsigned int64_t”不是。
答案 3 :(得分:0)
除了其他事情,因为没有类型unsiged int64_t
。由于同样的原因,宏不起作用。但是如果你#define __int64 int
,这将有效,因为有unsigned int
类型。