Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
1

Про синтаксис using

15.10.2015, 23:59. Показов 2163. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе время суток

Часто встречаю такую конструкцию:
C++ (Qt)
1
2
3
4
5
6
#include <iostream>
using std::cout;
using std::cin;
 
#include <string>
using std::string;
я правильно понимаю что при сборке компилятор переносит только указанные функции, и если нет то зачем так пишут?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2015, 23:59
Ответы с готовыми решениями:

подскажите про синтаксис NOLOCK
Добрый день, спасибо что зашли в вопрос, а он вот какой: В ситуации, когда при выборке мы даём...

Задача про сокращенный синтаксис
Всем здравствуйте! Решаю задачку: Ваша команда пишет программу с оконным интерфейсом, и вам надо...

Вопрос про обновляемый запрос и итоговые данные, синтаксис DLookup...
Господа, подскажите пожалуйста правильное решение! Простой пример: Таблица уникальных названий...

Где можно прочитать про использование и синтаксис баз данных DBISAM в Delphi?
Вот код проекта, который я частично унаследовал от предшественников, частично дополнил сам (вроде...

18
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
16.10.2015, 00:22 2
Лучший ответ Сообщение было отмечено Mesteriis как решение

Решение

Цитата Сообщение от Mesteriis Посмотреть сообщение
я правильно понимаю
Нет. Если под "сборкой" вы понимаете Линковщик, то ему глубоко плевать до исходного текста. А #include - штука простая, деревенская. Это просто включение текста в код. И никакой другой мистики.
По поводу using - не отвечу точно. Это штука левая, Борланд сначала сделал Дельфу, там она что-то обозначала, компенсировала врожденные убожества Паскаля. Ну а потом ничего умнее не придумал, как всю эту заморочку в Борладд-Си++ перенести. Там многие глупости есть, объясняемые спешкой и небрежностью, ей сопутствующей.
1
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
16.10.2015, 00:33  [ТС] 3
Байт, Примного благодарен, а тогда еще вопросик маленький, допустим из всей библиотеки я использую только одну функцию, есть ли возможность из всего "зверинца выбрать только зебру" то есть не переносить весь код библиотеки, или тут из сери хочешь кататься люби и саночки возить?

Добавлено через 4 минуты
И вообще какой нибудь хороший ресурс не посоветуешь где можно прочитать про предпроцесор с++? А то интернет большой шлака очень много!
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
16.10.2015, 00:45 4
Цитата Сообщение от Mesteriis Посмотреть сообщение
вопросик маленький
В инклюдах и в самом тексте исходника вы можете объявлять хоть черта в ступе. Типа
C++
1
void ChertVStupe(int kocherga);
Если нигде у вас вызова этой функции нет, то никто ничего и не вякнет. Соответственно и все библиотечные. Объявлять - объявляйте. Пусть Транслятор знает, что они есть. И как они устроены. Но Линковщик привяжет только те, которые и в самом деле нужны.
И я вам советую подумать. коли вы задаете такие вопросы. Что у "компиляции" есть три стадии (это упрощенно, чтоб не ругались знатоки). Прекомпиляция (макроподстановка) - Собственно компиляция (перевод в машинные коды объектных модулей) - Линковщик (связывание ссылок на вызываемые функции с из кодами реализации)
2
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
16.10.2015, 00:49  [ТС] 5
Байт, Чувство юмора у вас отменное сэр!))))
В любом случае спасибо за ответ!
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
16.10.2015, 00:50 6
Цитата Сообщение от Mesteriis Посмотреть сообщение
какой нибудь хороший ресурс не посоветуешь
Главный ресурс - собственная башка! Господи! Это так все просто, и столько всякой ерунды об этом можно написать! Но совсем не обязательно все это читать. Лично я прочел под стук колес на верхней полке плацкарта K&R, и ничего мне больше не надо.
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
16.10.2015, 07:40 7
Mesteriis, данные объявления указывают компилятору в каком пространстве имен находятся указанные классы. Т.е. в коде далее не нужно будет явно указывать пространство имен:
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
16.10.2015, 08:41 8
Цитата Сообщение от Байт Посмотреть сообщение
Это штука левая
Это абсолютно легальная и стандартная для С++ штука.
Внесение указанного имени в текущее пространство имен.
0
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
16.10.2015, 11:31  [ТС] 9
Ilot, DrOffset, хорошо а чем тогда разница от using namespace std;
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
16.10.2015, 11:36 10
Лучший ответ Сообщение было отмечено Mesteriis как решение

Решение

Цитата Сообщение от Mesteriis Посмотреть сообщение
хорошо а чем тогда разница от using namespace std;
using namespace namespace_name; - вносит все имена из пространства имен namespace_name в текущее.
using namespace_name::some_name; - вносит только имя some_name из пространства имен namespace_name в текущее.
1
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
16.10.2015, 14:21  [ТС] 11
DrOffset, OK, теперь все понял, спасибо за ответ

Добавлено через 2 часа 43 минуты
DrOffset, Не не понял, точнее не въезщяю для какой цели так писать, коль мы знаем что функцией include я по сути переношу весь код из указанного файла/библиотеки в майн (ну или где он написан), то какой смысл писать усеченную конструкцию using, вместо using namespace. я не про то что они делаю, это я понял, я про то какие цели преследует программист когда использует using? Там ошибок в последствие меньше или еще что. Просто хочу понять логику.
Или же это вообще не принципиально, и наследство разных стандартов? Там скажем когда то было только using а потом для упрощения ввели using namespace.
Извените за тупой вопрос но просто хочу полностью разобраться!
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
16.10.2015, 14:59 12
Лучший ответ Сообщение было отмечено Mesteriis как решение

Решение

Mesteriis, ответ напрямую зависит от того, осознаешь ли ты зачем вообще нужны namespace.
namespace - это инструмент уменьшения сложности программы (который, конечно же, можно применить неправильно и эту самую сложность увеличить ). Т.е. с помощью него можно произвести декомпозицию сущностей в соответсвии с их логическим назначением. Например, классы и функции для работы с сетью можно поместить в namespace network, классы для работы с файловой системой в namespace filesystem и т.д.
При грамотном проектировании указание namespace должно не только защищать программиста от потенциальных конфликтов имен, но и подсказывать о принадлежности класса или функции то или иной логической составляющей программы.
Точно так же и с std. Увидев std:: перед именем, можно сразу понять, что данное имя из стандартной библиотеки - соответственно понять где искать справку или вспомнить что эта функция делает.
Теперь об отрицательных стронах. Декомпозиция - это хорошо, но иногда она мешает. Например, namespace может иметь вложенные namespac`ы, или слишком длинное имя. Поэтому повторять это каждый раз неудобно. Для решения этой проблемы служат различные using`и.
Можно рассмотреть несколько ситуаций, например когда имена из неймспейса активно использутся в некой части программы, пространство имен имеет длинное имя, да еще и вложено в другое пространство имен. Для решения проблемы можно поступить двумя способами. Один я условно назову "хорошим" (потому что мой практический опыт говорит об этом), другой - "плохим" (по этой же причине).
Хороший способ - сделать так:
C++
1
namespace some = some_long_namespace::another_namespace;
Теперь, используя some::<различные имена из namespace some_long_namespace::another_namespace>, мы получаем более короткое и удобное имя (some) для обозначения длинного namespace, и в то же время избегаем конфликта имен, который неизбежно возникнет (чем больше проект, тем больше вероятность), если применить плохой способ:
C++
1
using namespace some_long_namespace::another_namespace;
Включение же конкретного имени ( например using std::string; ) из пространства имен - это эдакий компромисс. Т.е. мы не вносим все имена (избегаем конфликтов с потенциально большим количеством имен - ведь namespace может содержать сотни разных имен), а вносим только одно. Теперь его можно использовать так, как будто оно объявлено в текущем пространстве имен. Если и будет какой-то конфликт, то только с этим именем.

Теперь по твоим предположениям:
Цитата Сообщение от Mesteriis Посмотреть сообщение
include я по сути переношу весь код из указанного файла/библиотеки в майн
include включает текст, пофигу какой. include - это препроцессор, препроцессор - это вспомогательный язык, dsl. сущности С++ ему неведомы. namespace же - это языковое (С++) средство декомпозиции, которое в свою очередь ничего не знает про препроцессор.
Конечно, человеку со стороны, незнакомому с историей развития С и С++, покажется странным, что вроде бы похожие механизмы работают совсем по-разному и даже слабо связаны друг с другом. Но лучше и не притрагиваться к С++, если не готов принять его историю В любом случае - эта проблема планируется к решению с помощью введения модулей.
Цитата Сообщение от Mesteriis Посмотреть сообщение
какой смысл писать усеченную конструкцию using, вместо using namespace
Всегда лучше использовать наиболее безопасный вариант при прочих равных. Знакомо выражение "из пушки по воробьям"? Если тебе не требуется использовать десятки имен из namespace в одном месте, то using namespace будет являться той самой пушкой. Думать надо в первую очередь о том, что если внесено разделение на разные неймспейсы, то, вероятно, не просто так. Нарушать правила можно, но только если есть на то основания. Поэтому если оснований нет, то лучше пользоваться более простыми средствами.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.10.2015, 15:03 13
Цитата Сообщение от Mesteriis Посмотреть сообщение
что функцией include я по сути переношу весь код из указанного файла
1. include - не функция, а директива препроцессору включить содержимое файла в текущий.
2. надо различать включение содержимого (через include) (по сути, просто текста, не зависимо от namespace) файла и сущностей (имен) из одного пространства (namespace) в текущее.

Мне кажется у тебя просто нет понимания что такое пространство имен (namespace), отсюда и вопросы.
1
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
16.10.2015, 15:05  [ТС] 14
Tulosba, Ну, скажем да, ты прав. по сути в с++ варюсь только 2й месяц.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
16.10.2015, 15:10 15
Цитата Сообщение от DrOffset Посмотреть сообщение
если применить плохой способ:
А ещё можно применить плохой способ внутри заголовочного файла и сделать способ вовсе ужасным.
Цитата Сообщение от Mesteriis Посмотреть сообщение
скажем да, ты прав.
Тогда читай повествование от DrOffset внимательно. Но вообще, это всё в учебниках по языку есть.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
16.10.2015, 15:13 16
Цитата Сообщение от Tulosba Посмотреть сообщение
А ещё можно применить плохой способ внутри заголовочного файла и сделать способ вовсе ужасным
Это точно
Особено если этот файл включается в паре сотен мест по всему проекту.
0
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
16.10.2015, 15:14  [ТС] 17
Tulosba,

Не по теме:

Не с учебниками у меня вообще плохо все, проще разбираться на конкретных примерах) Да и честно читать книги времени не особо(((( работа дети все такое

0
Tulosba
16.10.2015, 15:27
  #18

Не по теме:

Цитата Сообщение от Mesteriis Посмотреть сообщение
Да и честно читать книги времени не особо(
В книгах просто более комплексный подход. А лучше бы наверное и вовсе какие-то курсы.
На форуме проще решать частную проблему, нежели учить язык от A до Z.

0
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
16.10.2015, 15:34  [ТС] 19
Tulosba,

Не по теме:

да как бы мне 28, есть жена потомство хлопоты, да и работаю я вообще не по профилю программиста, я финансист, это так для души, да и себе мелкие программки пишу для облегчения жизни. До с++ как то обходился башскриптами, а сейчас понял что этого мало для моих хотелок. Вот и сижу по тихоньку ковыряюсь.

0
16.10.2015, 15:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2015, 15:34
Помогаю со студенческими работами здесь

Как перевести синтаксис макроса VBA (Excel) в синтаксис Visual FoxPro
Здравствуйте! Скажите пожалуйста, как перевести синтаксис записанного макроса в excel в синтаксис...

Как перевести синтаксис Intel в синтаксис AT&T? (ассемблерная вставка в СИ)
Извиняюсь, что, возможно, пишу не в ту тему. Нужен именно AT&amp;T синтаксит. В качестве примера для...

Синтаксис запросов vs. синтаксис методов
Занимаюсь изучением LINQ'a, и возник вопрос, как переписать следующий запрос IEnumerable&lt;int&gt;...

И снова про PopupMenu (было про длину, теперь про ширину)
Добавляем в пустое PopupMenu несколько пунктов динамически (шириной, например, до 50 символов)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru