在c++
中,当我尝试编译以下代码时,我收到了一个冲突的声明错误:
#include <iostream>
using namespace std;
typedef uint_least64_t uint;
int main() {
uint i = -1;
cout << i << endl;
}
错误:
main.cpp:5:24: error: conflicting declaration ‘typedef uint_least64_t uint’
typedef uint_least64_t uint;
^~~~
In file included from /usr/include/stdlib.h:275:0,
from /usr/include/c++/6/cstdlib:75,
from /usr/include/c++/6/ext/string_conversions.h:41,
from /usr/include/c++/6/bits/basic_string.h:5417,
from /usr/include/c++/6/string:52,
from /usr/include/c++/6/bits/locale_classes.h:40,
from /usr/include/c++/6/bits/ios_base.h:41,
from /usr/include/c++/6/ios:42,
from /usr/include/c++/6/ostream:38,
from /usr/include/c++/6/iostream:39,
from main.cpp:1:
/usr/include/x86_64-linux-gnu/sys/types.h:152:22: note: previous declaration as ‘typedef unsigned int uint’
typedef unsigned int uint;
^~~~
我认为冲突声明错误是因为uint
的类型声明已经存在于语言的某个位置,我相信类型为uint_least32_t
,因为:
#include <iostream>
using namespace std;
int main() {
uint i = -1;
cout << i << endl;
}
返回一个(2 ^ 32)-1的整数值。因此,c++
可以将uint
重新定义为uint_least64_t
。
答案 0 :(得分:2)
正如您从错误消息中看到的那样,在您的平台上<iostream>
拉入<string>
,其中<cstdlib>
拉入<stdlib.h>
,其中<sys/types.h>
拉入<sys/types.h>
{1}}。
查看源代码,我们可以看到#ifdef __USE_MISC
/* Old compatibility names for C types. */
typedef unsigned long int ulong;
typedef unsigned short int ushort;
typedef unsigned int uint;
#endif
执行此操作:
#ifdef __USE_MISC
__USE_MISC
后卫是feature_test_macros
系统的一部分。如果您请求_DEFAULT_SOURCE
,则会在内部设置-ansi
(如果您没有请求,也会设置{。}}。
因此,您应该可以通过使用-std=...
或其中一个-std=c++11
选项(例如preg_replace
)进行汇总来绕过问题。
答案 1 :(得分:0)
uint
不是标准C ++的一部分。
很可能代码库中的某些内容正在引入它,或者甚至是编译器附带的C ++标准库。您可能很幸运,图书馆已经引入了std::uint
,当您编写污染声明using namespace std;
时,您将其引入全局命名空间。
可悲的是,一旦引入typedef
,你就无法取消class
类型或隐藏{。}}。
所以你只需要使用不同的符号。
答案 2 :(得分:0)
您无法重新定义typedef符号,并且必须使用不同的(未使用的)符号。
如果您想使用相同的符号,可以将其包装在命名空间中,如本文所述:Using a typedef'd uint causes error, while "unsigned int" does not...?