2010-10-17 5 views
13

В Xcode с помощью LLVM 2.0, когда я поставил линию using namespace std; в моем коде C++, я получаю это предупреждение:LLVM Compiler 2.0: предупреждение с использованием «using namespace std;»

Semantic выпуск
Использование директивы означает неявно определенные пространства имен 'зЬй'

Есть ли способ исправить это? Почему это предупреждение?

+1

Вы помещаете * просто * эту линию? – GManNickG

+2

Включите ли вы заголовок, который имеет это пространство имен? – JoshD

+2

Xcode 4 все еще находится под NDA; вы должны задать этот вопрос на форуме бета-версии Apple, это единственный форум, в который вы вступили в компанию NDA с ​​Apple. (https://devforums.apple.com/community/xcode4 - для входа/записи требуется ваша программа для входа в программу apple dev) –

ответ

24

Включили ли вы стандартные файлы заголовков? В противном случае компилятор не знает о namespace std.

Пожалуйста, напишите больше кода для уточнения.

+4

А, я просто понял это. Вы правы, строка 'using namespace std;' была первой строкой (помимо операторов #ifndef и #define, конечно) в файле; Я переместил его после строки '#include ' и он исключил предупреждение. GCC никогда не давал этого предупреждения, поэтому я никогда об этом не думал. Благодаря! –

4

я решил эту проблему, как этот

#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

Перемещение с помощью патезрасе, чтобы после того, как #include может устранить это предупреждение.

-2

Я вижу, что этот вопрос является довольно старым, но для тех, кто проверяя это в будущем, я хотел бы добавить эту ссылку из документации LLVM в качестве дополнения к обсуждению и Poeple ищет для получения дополнительной информации:

LLVM Coding Standards: Do Not use using namespace std;

Я считаю, что название довольно показательно, почему я поделился им, чтобы помочь с этим вопросом.

В LLVM мы предпочитаем явно префикс всех идентификаторов из стандартного пространства имен с префиксом «std ::», а не полагаться на «using namespace std;».

В заголовочных файлах добавление директивы «using namespace XXX» загрязняет пространство имен любого исходного файла, которое # включает заголовок. Это явно плохо.

Редактировать: Так что, если использовать 'using std namespace;' явно введите std :: для каждого случая, когда вы используете стандартную библиотеку. Это позволяет избежать конфликтов с пространствами имен исходных файлов. Вот что советует цитата из статьи.

+0

Это не дает ответа на вопрос. Когда у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы сможете [прокомментировать любое сообщение] (http: // stackoverflow.ком/помощь/льготы/комментарий); вместо этого [предоставить ответы, которые не требуют разъяснений у аськи) (http://meta.stackexchange.com/questions/214173/why-do-need-50-reputation-to-comment-what-can- я-делать-вместо этого). - [Обзор] (/ review/low-quality-posts/13390173) – cpburnz

+0

Я нахожусь на работе и просто пытаюсь помочь другим людям в подобных ситуациях, предоставив полезную информацию, которая обращается к этой точной проблеме. Я думаю, что ответ добавляет ответы, уже предоставленные. Если это проблематично, я просто сниму его. Если бы я задавал этот вопрос, я бы хотел, чтобы кто-то поделился этим заявлением от llvm со мной. –

+1

@cpburnz Я думаю, что я новичок в стиле, в котором просят помочь, потому что для меня это было бы полезно. В частности, что еще я мог бы добавить к этому нечеткому ответу? Он предназначен как альтернативное предложение для уже опубликованных ответов. –