C ++代码无法编译,错误“long type-name”无效

时间:2016-06-06 00:30:39

标签: c++ c++14 thrift

我更愿意避免使用typedef更喜欢using,但我偶然发现我必须使用它的情况,因为thrift(0.9.3版)输出的代码使用一个typedef。最小的错误实例来自以下代码

#include <iostream>
using namespace std;

typedef int64_t long;
typedef int32_t int;

int main() {

    cout << "Hello world " << endl;
    return 0;
}

我得到的错误是

test.cpp:4:17: error: 'long type-name' is invalid
typedef int64_t long;
                ^
test.cpp:4:1: error: typedef requires a name [-Werror,-Wmissing-declarations]
typedef int64_t long;
^~~~~~~~~~~~~~~~~~~~
test.cpp:5:17: error: cannot combine with previous 'type-name' declaration specifier
typedef int32_t int;
                ^
test.cpp:5:1: error: typedef requires a name [-Werror,-Wmissing-declarations]
typedef int32_t int;
^~~~~~~~~~~~~~~~~~~
4 errors generated.

我从g++ --version得到的输出是

Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.4.0
Thread model: posix

有人可以帮助解决此错误吗?

2 个答案:

答案 0 :(得分:2)

long是c ++中的关键字,因此您无法创建名为long的类型。请参阅list

但问题是Thrift生成的代码。我用Thrift做了一些实验,我可以通过在官方tutorial.thrift文件中添加这一行来重现这个问题:

typedef i64 long

显然,Thrift不会检查是否要编译。所以你需要确保你的typedef适用于所有可能的语言。

答案 1 :(得分:0)

应该是

typedef long int64_t;
typedef int int32_t;

Typedef就像变量声明一样工作,前面只有typedef