2017-03-23 2 views
1

Ich versuche Stroustrup "std_lib_facilities.h" Header-Datei (die hier ist:) zu kompilieren in macOS Sierra, Sublime Text 3 (über Build-Systeme), Apple LLVM Version 8.0.0 (clang-800.0.38). Ich habe mit verschiedenen Einstellungen herumgespielt, konnte aber zwei Warnungen nicht vermeiden, obwohl der Anfang "Hello, World!" Programm kompiliert wird und läuft:C++ Stroustrup "std_lib_facilities.h" String-Struktur - Warnung: Vergleich von unsigned Ausdruck

std_lib_facilities.h:107:8: warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare] 
       if (i<0||size()<=i) throw Range_error(i); 
        ~^~ 
std_lib_facilities.h:113:8: warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare] 
       if (i<0||size()<=i) throw Range_error(i); 
        ~^~ 

, wo die Linien in Frage sind Teil:

// trivially range-checked string (no iterator checking): 
struct String : std::string { 
    using size_type = std::string::size_type; 
// using string::string; 

    char& operator[](unsigned int i) // rather than return at(i); 
    { 
     if (i<0||size()<=i) throw Range_error(i); 
     return std::string::operator[](i); 
    } 

    const char& operator[](unsigned int i) const 
    { 
     if (i<0||size()<=i) throw Range_error(i); 
     return std::string::operator[](i); 
    } 
}; 

Meine C++ bauen Einstellungen für Sublime Text-Datei aus Can't build C++ program using Sublime Text 2 kopiert wird nach meinem Compiler offenbar nicht C erkennen ++ 11 wie in How do I update my compiler to use C++11 features? beschrieben:

{ 
    "cmd": ["g++", "-Wall", "-Wextra", "-pedantic", "-std=c++11", "${file}", "-o", "${file_path}/${file_base_name}"], 
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", 
    "working_dir": "${file_path}", 
    "selector": "source.c, source.c++", 

    "variants": 
    [ 
     { 
      "name": "Run", 
      "cmd": ["bash", "-c", "g++ -Wall -Wextra -pedantic -std=c++11 '${file}' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"] 
     } 
    ] 
} 

ich würde es begrüßen, wenn mir jemand helfen könnte zu verstehen, warum diese Warnungen sind passiert und lösen th em.

+1

Es bedeutet, dass es für einen * unsigned * -Wert unmöglich ist, negativ zu sein, und als solche, dass ein Teil des Ausdrucks ist immer falsch * sein wird *. – WhozCraig

+0

Richtig, das macht Sinn - ich nehme an, ich habe angenommen, dass Stroustrup keine solche Redundanz schreiben würde und daher stimmt etwas mit den Einstellungen für meinen Compiler oder andere Tools nicht. – wander

Antwort

2

Ich würde den i<0|| Teil entfernen und fortfahren.

Ja, das ist der Vater von C++ auch menschlichem :)

+0

Danke, also ist das auf keinen Fall ein Problem mit den Einstellungen meines Compilers, Version von C++, etc.? – wander

+0

@wander, es ist eine Kombination. Sie können die Compilereinstellungen so einstellen, dass solche Warnungen ignoriert werden. –

+0

@wander Nein, Ihr Compiler erzeugt eine gute Warnung. Es ist möglich, diese Warnung zu deaktivieren, aber die Warnung ist eine gute, also wollen Sie nicht. – Yakk

Verwandte Themen