重新定义uint类型c ++

时间:2017-10-07 18:22:39

标签: c++ c++11

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

3 个答案:

答案 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...?