2017-10-07 4 views
0

In c++ wenn ich versuche, den folgenden Code ich eine widersprüchliche Erklärung Fehler zu kompilieren:neu definieren uint Typ C++

#include <iostream> 
using namespace std; 

typedef uint_least64_t uint; 

int main() { 
    uint i = -1; 
    cout << i << endl; 
} 

Fehler:

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; 
         ^~~~ 

Ich gehe davon aus, dass Erklärung Fehler in Konflikt, weil der Art ist, Erklärung für uint existiert bereits irgendwo in der Sprache, und ich glaube, dass der Typ uint_least32_t ist, weil:

#include <iostream> 
using namespace std; 

int main() { 
    uint i = -1; 
    cout << i << endl; 
} 

gibt einen ganzzahligen Wert zurück, der (2^32) -1 ist. Daher ist es möglich, in c++uint als uint_least64_t neu zu definieren.

+0

Zeigen Sie den Rest Ihres Codes. – melpomene

+0

Die Frage wurde bearbeitet. Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. – Sajeeb

Antwort

0

uint ist nicht Teil von Standard C++.

Es ist durchaus möglich, dass etwas in Ihrer Codebasis es einführt, oder vielleicht sogar die C++ - Standardbibliothek, die mit Ihrem Compiler geliefert wird. Sie könnten Glück haben und die Bibliothek hat std::uint eingeführt und Sie führen das in den globalen Namespace ein, wenn Sie diese umweltschädigende Anweisung schreiben using namespace std;.

Leider können Sie nicht typedef eine Art oder verbergen class, sobald es eingeführt wurde.

Sie müssen also nur ein anderes Symbol verwenden.

+0

"Leider können Sie den Typ nicht mehr rückgängig machen oder eine Klasse verbergen, sobald sie eingeführt wurde.". Ich denke, das bedeutet, ich muss jede Instanz von Uint in Uint_least64_t oder eine Typedef von diesem ändern – Sajeeb

+0

Ah, jetzt haben Sie mehr Code eingefügt, Sie nie wissen, Entfernen 'using Namespace std;' könnte es beheben. – Bathsheba

+0

traurig, tut es nicht – Sajeeb

2

Wie Sie aus der Fehlermeldung sehen, auf der Plattform <iostream> zieht in <string>, die in <cstdlib> zieht , die <stdlib.h> zieht, die <sys/types.h> zieht.

auf den Quellcode suchen, können wir sehen, dass <sys/types.h> dies tut:

#ifdef __USE_MISC 
/* Old compatibility names for C types. */ 
typedef unsigned long int ulong; 
typedef unsigned short int ushort; 
typedef unsigned int uint; 
#endif 

Der #ifdef __USE_MISC Schutzteil des feature_test_macros Systems. __USE_MISC wird intern festgelegt, wenn Sie _DEFAULT_SOURCE anfordern (was auch festgelegt wird, wenn Sie nichts anderes anfordern).

Sie sollten in der Lage sein, das Problem zu umgehen, indem Sie mit -ansi oder einer der -std=... Optionen (z. B. -std=c++11) kompilieren.