我更愿意避免使用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
有人可以帮助解决此错误吗?
答案 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
。