Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23

Пространство имен и конфликт имен

04.10.2020, 22:00. Показов 4911. Ответов 32

Студворк — интернет-сервис помощи студентам
Доброго времени суток уважаемые пользователи. В контексте решаемой задачи возникла необходимость написать функцию деления двух чисел, в ней нет абсолютно ничего особенного, да и вопрос, собственно, не к функции. Вот ее код:
C++
1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
 
int div(int x, int y)
{
    return x/y;
}
 
...
Проблема в том что, компилятор жалуется на уже имеющуюся в функцию в файле stdlib.h со схожей сигнатурой, но отличным возвращаемым типом, хотя, как видно выше, файл stdlib.h мною не подключался и из стандартного пространства имен подключены только три функции, но, не смотря на эти ограничения, конфликт имен все еще существует. Почему такое происходит, ведь в данной ситуации не должно быть конфликта имен? Прошу Вас указать в чем моя ошибка.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.10.2020, 22:00
Ответы с готовыми решениями:

пространство имен
Здравствуйте! У меня вопрос...В си есть такая функция printf, которая аналогична функции С++ cout. Почему, когда нам необходимо...

Пространство имен
Я часто встречаю в книгах, туторах, что объявлять пространство имен в больших проектах нельзя(не рекомендуемо), но нигде не сказано...

пространство имён
Здравствуйте. Из C# я примерно представляю что такое пространство имён. Но возникает вопрос. Допустим в программе я использую...

32
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
04.10.2020, 23:58  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Vourhey Посмотреть сообщение
Я устал
Я ухожу.

Добавлено через 13 минут
Цитата Сообщение от hoggy Посмотреть сообщение
ты не русский что ли?
Да
Цитата Сообщение от hoggy Посмотреть сообщение
не к "чему же", а "для чего".
Для чего используется мне прекрасно известно, мне нужно было знать именно к чему, к какому заголовочному файлу используется using по мнению пользователя Vourhey,
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
05.10.2020, 00:06
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
к какому заголовочному файлу используется using
Ни к какому. using не связан с какими-либо заголовочными файлами. Ты усложняешь простые вещи и приходишь к странным выводам про какие-то библиотеки и связи между пространствами имен и файлами. Все просто:
#include <файл>
вставляет в том месте, где он написан, текст из <файл>. Когда вся иерархия инклудов вставилась в один файл - компиляция. Всё. Не надо выдумывать, кто куда входит, кто с чем связан, и к какому файлу отновится using, или не относится.
1
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
05.10.2020, 00:31  [ТС]
Цитата Сообщение от Vourhey Посмотреть сообщение
Ни к какому. using не связан с какими-либо заголовочными файлами. Ты усложняешь простые вещи и приходишь к странным выводам про какие-то библиотеки и связи между пространствами имен и файлами. Все просто:
#include <файл>
вставляет в том месте, где он написан, текст из <файл>. Когда вся иерархия инклудов вставилась в один файл - компиляция. Всё. Не надо выдумывать, кто куда входит, кто с чем связан, и к какому файлу отновится using, или не относится.
Премного благодарен Вам за потраченное время.

Добавлено через 11 минут
Цитата Сообщение от Vourhey Посмотреть сообщение
Все просто:
#include <файл>
вставляет в том месте, где он написан, текст из <файл>. Когда вся иерархия инклудов вставилась в один файл - компиляция. Всё. Не надо выдумывать, кто куда входит, кто с чем связан, и к какому файлу отновится using, или не относится.
Но ведь нам будут недоступны программные элементы из iostream, без директивы using. Простое подключение заголовочного файла и последующее использование входящих в нее программных элементов является особенностью языка C, а не C++.

Добавлено через 4 минуты
Vourhey, Буду Вам очень признателен, если получу комментарий к моему последнему утверждению
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
05.10.2020, 00:45
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
Но ведь нам будут недоступны программные элементы из iostream, без директивы using.
Опять двадцать пять.
Весь текст из stdlib.h попал в твой исходный код в месте, где у тебя #include <iostream>. При чем тут using или не-using?

Добавлено через 58 секунд
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
Простое подключение заголовочного файла и последующее использование входящих в нее программных элементов является особенностью языка C, а не C++.
Нет.

Добавлено через 12 минут
Если все сократить, то у тебя перед компиляцией получился такой примерно код в твоем исходнике:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// заголовочная фигня
struct A
{};
 
A div(int a, int b)
{ return A(); }
 
namespace std
{
    using ::div;
}
 
// здесь начинается твой код
int div(int a, int b)
{ return 0; }
 
int main()
{
}
Здесь нет ничего, в чем сыграли какую-то роль using у тебя в коде.
2
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
05.10.2020, 00:49  [ТС]
Цитата Сообщение от Vourhey Посмотреть сообщение
При чем тут using или не-using?
Но почему для использования cout, cin и т.д. пишется using std::cout, using std::cin, либо using namespace std, либо std::cout, std::cin и т.д., если весь код из <файл>, по вашим словам, просто вставляется в текст. Оставим в стороне stdlib.h с ее функцией div.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
05.10.2020, 00:58
Лучший ответ Сообщение было отмечено DrFaust1729 как решение

Решение

DrFaust1729, потому что iostream чисто с++-сный заголовочный файл, и все, что из него "просто вставляется в текст" находится внутри namespace std. А вот то, что "просто вставляется в текст" из попутно попавшихся си-шных заголовочных файлов естественно вставляется без namespace std. Любой cи-шный заголовочный файл в адаптации с++ (с переносом си-шных функций в std:: и префиксом с перед именем файла) может содержать и оригинальные объявления из си, без всяких namespace.

Добавлено через 4 минуты
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
по вашим словам
И это конечно же не по его словам. Это просто факт о работе препроцессора в С\С++. Препроцессор - это в принципе инструмент текстовой подстановки.
1
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
05.10.2020, 01:08
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
Но почему для использования cout, cin и т.д. пишется using std::cout, using std::cin, либо using namespace std, либо std::cout, std::cin и т.д., если весь код из <файл>, по вашим словам, просто вставляется в текст.
Потому что в некоторых файлах некоторые функции и классы помещены внутрь пространства имен. Что опять же не связано с тем, как #include просто подставляет текст.

Добавлено через 1 минуту

Не по теме:

Ой. DrOffset уже это написал. Не видел.

1
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
05.10.2020, 01:10  [ТС]
Спасибо DrOffset, т.е. препроцессор вставляет в текст весь код из заголовочного файла, но некоторые элементы не входят ни в какие пространства имен (сишные), а некоторые (с++-сные) входят, и для них и используется using.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
05.10.2020, 01:14
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
но некоторые элементы не входят ни в какие пространства имен (сишные)
Да не в сишности суть! Можно на С++ написать функцию/класс/структуру, которые тоже не будут в std, а будут в глобальной области. не в языке дело.
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
а некоторые (с++-сные) входят,
Ну вот тот же div - сишный, но он тоже видим под std. Не в сишности и С++-ности дело. Как код внутри файла написан, так и будет.
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
для них и используется using.
Можно через using, можно просто через имя namespace'ов с ::
0
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
05.10.2020, 01:18  [ТС]
Цитата Сообщение от Vourhey Посмотреть сообщение
Да не в сишности суть
Сишность и с++-ность, сказано к примеру. Смысл того, что я написал в том, что в одном файле могут находится файлы не входящие в пространство имен и входящие, для которых и используется using или
Цитата Сообщение от Vourhey Посмотреть сообщение
просто через имя namespace'ов с ::
.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
05.10.2020, 01:20
Лучший ответ Сообщение было отмечено DrFaust1729 как решение

Решение

Цитата Сообщение от DrFaust1729 Посмотреть сообщение
Смысл в того, что я написал в том, что в одном файле могут находится файлы не входящие в пространство имен и входящие
Да.
Цитата Сообщение от DrFaust1729 Посмотреть сообщение
для которых и используется using
Да. Как вариант, для удобства доступа.
1
1 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 23
05.10.2020, 01:24  [ТС]
Спасибо большое пользователю DrOffset и особенно пользователю Vourhey . Считаю вопрос закрытым.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
05.10.2020, 06:09
Цитата Сообщение от Vourhey Посмотреть сообщение
Нет никакого пространства имен в сишном заголовке.
С педантичной точки зрения это не верно. В С++ нет никаких "сишных заголовоков", уже хотя бы потому что "сишные заголовки" запросто могут быть несовместимы с С++.

Ситауция с <name.h> заголовками (которые, кстати, deprecated) полность симметрична ситуации с <cname> заголовками. То есть заголовки <name.h> должны объявлять все имена в глобальном пространстве имен, но имеют при этом полное право объявлять их сначала в пространстве имен std, а затем просто вытаскивать в глобальное через using-объявления. В частности, заголовок <name.h> может включать в себя заголовок <cname> и реализовать себя на основе его. И наоборот. Все зависит от реализации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.10.2020, 06:09

Пространство имен
Здравствуйте, имеется код : triangle.h #ifndef TRIANGLE_H_INCLUDED #define TRIANGLE_H_INCLUDED namespace TRG { struct...

Пространство имён
Добрый вечер, 1) как правильно называется часть &quot;Foo::&quot; в этой записи void Foo::hello(){} 2) и почему не сделают using namespace...

Пространство имен
Зачем пространство имен в программировании я чет не понимаю? У мну в учебнике отак написано. Пространство имен, локализуя видимость...

Пространство имён!
Как лучше указывать пространство имён? using namespace std вначале? или std::? вроде бы проще первый вариант, но почему используют...

Пространство имён
Прочитал сейчас раздел про пространство имён, но так всё равно и не понял, почему лучше не использовать директиву using. Допустим,...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru