为什么我不能使用" unsigned"来限定别名类型?

时间:2016-03-22 14:36:46

标签: c++ linux windows

我将代码从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;或定义一个新类型,但为什么不能编译前面的代码?

4 个答案:

答案 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_tuint64_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类型。