2010-10-17 4 views
13

W Xcode za pomocą LLVM 2.0, kiedy kładę linię using namespace std; w moim kodu C++, mam to ostrzeżenie:Kompilator LLVM 2.0: Ostrzeżenie za pomocą "using namespace std;"

Semantic Issue
Korzystanie dyrektywa odnosi się pośrednio zdefiniowanej przestrzeni nazw 'std'

Czy istnieje sposób, aby to naprawić? Dlaczego daje to ostrzeżenie?

+1

Umieszczasz * tylko * tę linię? – GManNickG

+2

Czy uwzględniasz nagłówki z tym obszarem nazw? – JoshD

+2

Xcode 4 nadal znajduje się pod NDA; powinieneś zadać to pytanie na forum beta bet dev firmy Apple, jest to jedyne forum, na które NDA zawarłeś umowę z Apple, o które możesz poprosić. (https://devforums.apple.com/community/xcode4 - do zalogowania się/logowania wymagane jest zalogowanie się do programu Apple) –

Odpowiedz

24

Czy zawierasz jakieś standardowe pliki nagłówkowe? W przeciwnym razie kompilator nie wie o namespace std.

Proszę napisać więcej kodu, aby wyjaśnić.

+4

Ach, właśnie to rozgryzłem. Masz rację, linia 'using namespace std;' była pierwszą linią (oprócz instrukcji #ifndef i #define oczywiście) w pliku; Przeniosłem ją po linii '#include ' i usunęło to ostrzeżenie. GCC nigdy nie dawał tego ostrzeżenia, więc nigdy wcześniej o tym nie myślałem. Dzięki! –

4

I rozwiązać ten problem jak ten

#include <iostream> 

using namespace std; 
/// This function is used to ensure that a floating point number is 
/// not a NaN or infinity. 
inline bool b2IsValid(float32 x) 
{ 
    if (x != x) 
    { 
     // NaN. 
     return false; 
    } 
    float32 infinity = std::numeric_limits <float32>::infinity(); 
    return -infinity < x && x < infinity; 
    return true; 

} 
3

Przesuwanie using namespace std aby po #include można wyeliminować to ostrzeżenie.

-2

widzę, że to pytanie jest dość stary, ale dla każdego, sprawdzając to w przyszłości, chciałem dodać ten link z dokumentacją LLVM jako dodatek do dyskusji i ludzie ciężko poszukujących Więcej informacji:

LLVM Coding Standards: Do Not use using namespace std;

Uważam, że tytuł jest dość wskazujący, dlaczego udostępniłem go, aby pomóc w tym pytaniu.

W LLVM, wolimy jawnie prefiksować wszystkie identyfikatory ze standardowej przestrzeni nazw z prefiksem "std ::", zamiast polegać na "using namespace std;".

W plikach nagłówkowych dodanie dyrektywy "za pomocą przestrzeni nazw XXX" powoduje zanieczyszczenie przestrzeni nazw dowolnego pliku źródłowego, który # zawiera nagłówek. To oczywiście zła rzecz.

Edycja: Zamiast tego użyj "używając std namespace;" jawnie wpisz std :: dla każdego przypadku, w którym używasz standardowej biblioteki. Pozwala uniknąć konfliktów z przestrzeniami nazw plików źródłowych. To właśnie cytuje powyższy cytat z artykułu.

+0

Nie zapewnia to odpowiedzi na pytanie. Gdy masz już wystarczającą [reputację] (http://stackoverflow.com/help/whats-reputation) będziesz mógł [komentować dowolny post] (http: // stackoverflow.com/help/privileges/comment); zamiast tego [dostarczaj odpowiedzi, które nie wymagają wyjaśnień od pytającego] (http://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-zamiast). - [Z recenzji] (/ opinia/niskiej jakości-posts/13390173) – cpburnz

+0

Jestem w pracy i staram się pomóc innym ludziom w podobnych sytuacjach, dostarczając użytecznych informacji, które rozwiązują ten problem. Myślę, że odpowiedź dodaje do już udzielonych odpowiedzi. Jeśli jest to problematyczne, po prostu go odrzucę. Gdybym to ja zadał to pytanie, chciałbym, żeby ktoś podzielił się ze mną tym oświadczeniem ze strony llvm. –

+1

@ cpburnz Sądzę, że jestem nowy w stylu, w którym pomoc jest wymagana, ponieważ dla mnie byłaby przydatna. W szczególności, co jeszcze mogłem dodać do tej niejasnej odpowiedzi? Jest to raczej alternatywna propozycja odpowiedzi już opublikowanych. –