5 лучших ide для программирования на с и с++
Содержание:
- IntelliJ IDEA
- Smart C and C++ editor
- Что можете сделать лично вы?
- Установка стандарта языка C++ в Code::Blocks
- Компиляторы с открытым исходным кодом
- «Создание игр в Unity и программирование на языке C#» от онлайн-школы «Пиксель»
- Следующие шаги
- «Основы языка C#» от GeekBrains
- «Факультет разработки на C++» от GeekBrains
- Тестирование вашего компилятора
- Среды и компиляторы для программирования на C
- Hello world
- SharpDevelop IDE
- Компиляторы COBOL
- XCode
- Поиск по имени
IntelliJ IDEA
Еще одна IDE, разработанная Jet Brains. Она предлагает пользователям бесплатную версию Community Edition, 30-дневную бесплатную ознакомительную версию Ultimate Edition и годовую подписку на версию Ultimate Edition за $533 — $693. IntelliJ IDEA поддерживает Java 8 и Java EE 7, обладает обширным инструментарием для разработки мобильных приложений и корпоративных технологий для различных платформ. Если говорить о цене, IntelliJ является прекрасным вариантом из-за огромного списка функций.
Поддерживаемые языки программирования: AngularJS, CoffeeScript, HTML, JavaScript, LESS, Node JS, PHP, Python, Ruby, Sass, TypeScript и другие.
Особенности:
- Расширенный редактор баз данных и дизайнер UML;
- Поддержка нескольких систем сборки;
- Пользовательский интерфейс тестового запуска приложений;
- Интеграция с Git;
- Поддержка Google App Engine, Grails, GWT, Hibernate, Java EE, OSGi, Play, Spring, Struts и других;
- Встроенные средства развертывания и отладки для большинства серверов приложений;
- Интеллектуальные текстовые редакторы для HTML, CSS и Java;
- Интегрированный контроль версий;
- AIR Mobile с поддержкой Android и iOS.
Недостатки: эта среда разработки JavaScript требует времени и усилий на изучение, поэтому может оказаться не лучшим вариантом для начинающих. В ней есть много сочетаний горячих клавиш, которые нужно просто запомнить. Некоторые пользователи жалуются на неуклюжий интерфейс.
Smart C and C++ editor
Code assistance
Read and write code effectively with an editor that deeply understands C and C++.
Have completion results filtered by type in Smart Completion. Use Breadcrumbs
to track your location inside the hierarchy of scopes. Gain insight into function calls
thanks to parameter name hints. Find the context usages of a symbol or simply jump
to it by typing its name. CLion will even make sure your code conforms to coding guidelines,
including formatting, naming, and more.
Code generation
Generate tons of boilerplate code instantly. Override and implement functions
with simple shortcuts. Generate constructors and destructors, getters and setters,
and equality, relational, and stream output operators. Wrap a block of code with a statement,
or generate a declaration from a usage. Create custom live templates to reuse typical
code blocks across your code base to save time and maintain a consistent style.
Safe refactoring
Rename symbols; inline a function, variable, or macro; move members through the hierarchy;
change function signatures; and extract functions, variables, parameters, or a typedef.
Whichever automated refactoring you use, rest assured CLion will safely propagate
the appropriate changes throughout your code.
Quick Documentation
Inspect the code under the caret to learn just about anything: function signature details,
review comments, preview Doxygen-style documentation, check out the inferred type
for symbols lacking explicit types, and even see properly formatted final
macro replacements.
Что можете сделать лично вы?
Мы рассмотрели два приложения, в каждом из которых есть шероховатости. В случае второго приложения большинство этих недочетов исправят в C++20, но «осадочек остался». Ведь, наверное, с подобными проблемами встречаюсь в разработке не только я. И скорее всего, у разных людей «шероховатости» разные. Что в связи с этим делать?
В комитете по стандартизации хотелось бы видеть больше людей. Причём из разных областей, не обязательно из области высокой производительности. Нужны люди из стартапов, которые будут говорить, где им становится неудобно в начале работы над приложением. Нужны люди из академического мира. В комитете есть преподающие профессора, которые могут рассказать, где студенты стреляют себе в ноги. И с задних рядов слышен голос: «Да-да, я эксперт, и я тоже себе в этом месте ногу отстрелил».
Также требуются люди из тех областей, где C++ не популярен или вообще не используется. Хорошо, если в комитете будет сидеть матерый разработчик embedded-железок, слушать о том, как механизм исключений уместили в 200 байт, и говорить: «А у нас всего 128 байт (нет, не килобайт), думайте дальше».
Если вам что-то не нравится в C++ и вы хотите это улучшить или донести свою боль до комитета по стандартизации, начните с сайта stdcpp.ru. Там люди обмениваются мыслями, желаниями и проблемами, связанными с развитием языка C++. Идеи обсуждаются, обрабатываются и некоторые из них становятся официальными предложениями для международного комитета. При этом рук не хватает, поэтому особенно ценная помощь — когда человек готов не только генерировать идеи, но и браться за написание предложений к ним (хотя бы черновиков).
Драматичным шёпотом: и таким человеком может стать каждый из вас!
Установка стандарта языка C++ в Code::Blocks
Code::Blocks по умолчанию может использовать стандарт C++11. Хорошей новостью является то, что Code::Blocks позволяет устанавливать ваш стандарт языка С++ глобально, поэтому вы можете установить его один раз и сразу на все проекты (а не для каждого проекта в индивидуальном порядке). Для этого перейдите в меню :
Затем на вкладке найдите следующие пункты меню:
Отметьте тот пункт, у которого число обозначает ближайший (к текущему) год утверждения стабильной версии и нажмите (на вышеприведенном скриншоте этим пунктом является ).
Примечание: Если вы не нашли в ваших настройках опцию с C++17, то вам следует обновить вашу версию Code::Blocks.
Компиляторы с открытым исходным кодом
Качество продукции, компиляторы с открытым кодом .
- Амстердамский комплект компилятора (ACK)
- Компилятор Clang C / C ++ / Objective-C
- Оптимизирующий компилятор AMD C / C ++
- FreeBASIC [DOS / Linux / Windows]
- Free Pascal [DOS / Linux / Windows (32/64 / CE) / MacOS / NDS / GBA / .. (и многие другие)]
- GCC : C, C ++ (G ++), Java (GCJ), Ada (GNAT), Objective-C, Objective-C ++, Fortran (GFortran) и Go (GCCGo); также доступны, но не входят в стандартную комплектацию: Modula-2, Modula-3, Pascal, PL / I, D, Mercury, VHDL; Linux, BSD, OS X, NeXTSTEP, Windows и BeOS, среди прочего
- Локальный компилятор C
- Инфраструктура компилятора LLVM, которая также часто используется для исследований
- Переносимый компилятор C
- Откройте Watcom [Windows и OS / 2, Linux / FreeBSD WIP]
- TenDRA [C / C ++]
- Компилятор Tiny C
- Open64 , поддерживаемый AMD в Linux.
- Диалект XPL PL / I (несколько систем)
- Swift
«Создание игр в Unity и программирование на языке C#» от онлайн-школы «Пиксель»
Курс позволит вашему ребенку взглянуть на компьютерные игры со стороны разработчика. Программа построена в игровом формате, поэтому детям будет легко и интересно проходить обучение. В результате он сможет создавать простые игры, а в будущем начать карьеру программиста.
При покупке курса по промокоду GEEKTARGET вы получите аж 5% скидки. Советую не упускать эту возможность.
Цена: 22 500 рублей без скидки
Длительность: 9 месяцев
Формат обучения: вебинары
Кому подходит:
Ты научишься:
- Программированию на C# в Unity,
- Основам создания 2D и 3D игр,
- Созданию игровой реальности.
Плюсы
Наличие скидки по промокоду
Наличие скидки по промокоду Геймификация учебного процесса
Минусы
Курс предназначен только для детей
Следующие шаги
Этот пример «Hello, World» является самой простой программой C++. Реальные программы обычно имеют файлы заголовков, дополнительные исходные файлы и ссылки на библиотеки.
Вы можете использовать шаги, описанные в этом пошаговом руководстве по C++, для создания собственного кода, чтобы не вводить приведенный пример. Эти шаги также позволяют собрать множество примеров кода C++, которые можно найти в других местах. Вы можете разместить исходный код и собрать приложения в любом доступном для записи каталоге. По умолчанию интегрированная среда разработки Visual Studio создает проекты в папке пользователя во вложенной папке source\repos. Более старые версии могут помещать проекты в папку Документы\Visual Studio <version>\ Проекты*.
Чтобы скомпилировать программу с дополнительными файлами исходного кода, введите их все в командной строке, например:
Параметр командной строки указывает компилятору на необходимость стандартной обработки исключений C++. В противном случае созданные исключения могут привести к неуничтоженным объектам и утечкам ресурсов. Дополнительные сведения см. в статье /EH (модель обработки исключений).
При указании дополнительных исходных файлов компилятор использует первый входной файл для создания имени программы. В этом случае выводится программа с именем file1.exe. Чтобы изменить имя на program1.exe, добавьте параметр компоновщика /out:
Чтобы автоматически перехватывать другие ошибки программирования, рекомендуется выполнить компиляцию с помощью порога предупреждений /W3 или /W4:
В компиляторе cl.exe есть множество дополнительных параметров. Их можно применять для создания, оптимизации, отладки и анализа кода. Чтобы просмотреть краткий список, введите в командной строке разработчика. Можно также выполнять компиляцию и компоновку отдельно и применять параметры компоновщика в более сложных сценариях сборки. Дополнительные сведения о параметрах и использовании компилятора и компоновщика см. в справочнике по сборке для C/C++.
Для настройки и создания более сложных проектов в командной строке можно использовать NMAKE и файлы makefile, MSBuild и файл проекта или CMake. Дополнительные сведения об использовании этих средств см. в разделах Справочник по NMAKE, MSBuild и Проекты CMake в Visual Studio.
Языки C и C++ похожи, но имеют различия. Компилятор MSVC использует простое правило для определения языка, используемого при компиляции кода. По умолчанию компилятор MSVC рассматривает файлы с расширением как исходные файлы на языке С, а файлы с расширением — как исходные файлы на языке С++. Если указан параметр компилятора /TP, компилятор будет рассматривать все файлы как исходные файлы на языке С++ вне зависимости от расширения.
Компилятор MSVC содержит библиотеку времени выполнения C (CRT), которая соответствует стандарту ISO C99 с небольшими исключениями. Переносимый код обычно компилируется и выполняется, как ожидалось. Некоторые устаревшие функции библиотеки и несколько имен функций POSIX не рекомендуется использовать в компиляторе MSVC. Функции поддерживаются, но предпочтительные имена изменились. Дополнительные сведения см. в статьях Функции безопасности в CRT и Предупреждение компилятора (уровень 3) C4996.
«Основы языка C#» от GeekBrains
Курс отлично подходит пользователям, никогда прежде не сталкивавшимся с программированием. Благодаря ему ты сможешь понять основы C# и сделать огромный шаг в сторону профессиональной деятельности. Сам курс является частью полноценной образовательной программы по разработке игр на Unity.
Цена: 15 000 рублей
Длительность: 1 месяц
Формат обучения: видеоуроки и практические задания
Кому подходит:
Ты научишься:
- Работать в среде разработки .NET,
- Использованию эффективных алгоритмов обработки информации и основам ООП,
- Применению XML в своих программах,
- Разработке файловой базы данных,
- Созданию приложений для Windows.
Плюсы
Огромное количество положительных отзывов
Есть методологические пособия в качестве дополнения
Возможность общения с одногруппниками
Доступ к видеозаписям онлайн-занятий после окончания курса
Минусы
Высокая стоимость для заявленного количества уроков
«Факультет разработки на C++» от GeekBrains
Продвинутая образовательная программы, охватывающая работу как с C++, так и с языком C. После окончания обучения в твоем портфолио будет 9 полноценных проектов, которые серьезно помогут при трудоустройстве. В результате ты сможешь писать программы под Windows и мобильные платформы, а также создавать игры на Unreal Engine 4.
Цена: 139 000 рублей
Длительность: 18 месяцев
Формат обучения: видеоуроки, вебинары и практические задания
Кому подходит:
- Новичкам, прежде не сталкивавшимся с программированием,
- Разработчикам на других языках программирования.
Ты научишься:
- Программированию на языках C и C++,
- Знанию алгоритмов и структур данных,
- Сетевому программированию,
- Основам разработки графического интерфейса во фреймворке Qt,
- Управлению компиляцией,
- Разработке игр в движке Unreal Engine 4,
- Навыкам работы в команде.
Плюсы
Возможность оплаты курса в рассрочку
Возможность получения дополнительной скидки при оплате одним платежом
Изучение английского языка в подарок
Получение востребованного диплома
Девять проектов в портфолио
Помощь в трудоустройстве
Минусы
Высокая стоимость курса
Ограниченное время действия скидки
Тестирование вашего компилятора
После подключения версии C++17 или выше, вы можете провести тест, который позволит понять, всё ли верно сделано и действительно ли подключена новая версия языка С++. Следующая программа в С++17 должна выполниться без каких-либо предупреждений или ошибок:
#include <array>
#include <iostream>
#include <string_view>
#include <tuple>
#include <type_traits>
namespace a::b::c
{
inline constexpr std::string_view str{ «hello» };
}
template <class… T>
std::tuple<std::size_t, std::common_type_t<T…>> sum(T… args)
{
return { sizeof…(T), (args + …) };
}
int main()
{
auto { sum(1, 2, 3) };
std::cout << a::b::c::str << ‘ ‘ << iNumbers << ‘ ‘ << iSum << ‘\n’;
std::array arr{ 1, 2, 3 };
std::cout << std::size(arr) << ‘\n’;
return 0;
}
1 |
#include <array> namespacea::b::c { inlineconstexprstd::string_viewstr{«hello»}; } template<class…T> std::tuple<std::size_t,std::common_type_t<T…>>sum(T…args) { return{sizeof…(T),(args+…)}; } intmain() { autoiNumbers,iSum{sum(1,2,3)}; std::cout<<a::b::c::str<<‘ ‘<<iNumbers<<‘ ‘<<iSum<<‘\n’; std::arrayarr{1,2,3}; std::cout<<std::size(arr)<<‘\n’; return; } |
Если вы не можете скомпилировать этот код, то либо вы не подключили C++17, либо ваш компилятор не полностью поддерживает C++17. В последнем случае обновите версию IDE или компилятора.
Среды и компиляторы для программирования на C
Если вы пользуетесь одним из дистрибутивов GNU/Linux, вам подойдет любой текстовый редактор с подсветкой синтаксиса, также понадобятся GCC и терминал.
Существуют редакторы для программистов, включающие различные дополнения, в том числе терминал, просмотр каталогов и др. Например, Geany или Atom.
C – компилируемый язык программирования. В GNU/Linux для получения исполняемых файлов используется GCC – набор компиляторов, включающий в том числе компилятор для C. Чтобы из исходного файла (обычно таким файлам дают расширение *.с) получить исполняемый, надо выполнить в терминале команду примерно следующего вида:
gcc -o hello hello.c
, где gcc — команда, запускающая программу, выполняющую компиляцию и иные действия; -o – ключ, сообщающий, что мы вручную указываем имя исполняемого файла; hello – имя получаемого исполняемого файла; hello.c – имя файла с исходным кодом. Имя исполняемого файла можно не указывать:
gcc hello.c
В этом случае исполняемый файл будет иметь имя по умолчанию a.out.
Для Windows существует свой набор компиляторов – MinGW. Его можно использовать самостоятельно, однако он входит в состав простой среды разработки Dev-C++, которая может оказаться хорошим выбором для обучения программированию на языках C и С++.
При сохранении выбирайте тип файла «C source files (*.c)». Компиляция и запуск программы выполняется при нажатии клавиши F9. После исполнения программа сразу закрывается и результат невозможно увидеть. Чтобы этого не происходило, прописывают две дополнительные строки: #include <conio.h> и getch(). (Возможно это не актуально для более новой версии Dev-C++.)
«Hello World» в GNU/Linux:
#include <stdio.h> int main () { printf ("Hello World\n"); }
«Hello World» в Windows:
#include <stdio.h> #include <conio.h> int main () { printf ("Hello World\n"); getch(); }
С другой стороны, существует большое количество кроссплатформенных сред разработки. Например, Eclipse + модуль CDT, KDevelop, CLion.
«Hello World» на C
На примере простейшей программы сразу отметим некоторые особенности языка программирования C.
В языке C роль основной ветки программы берет на себя функция main(). Она является точкой входа в программу. Эта функция всегда должна присутствовать в законченной программе на языке C, и исполнение программы начинается именно с нее. Однако объявленные внутри нее переменные не являются глобальными, их область видимости простирается только на main(). Тем не менее в языке программирования C почти весь программный код заключается в функции, и функция main() является главной и обязательной.
По умолчанию функция main() возвращает тип данных int, поэтому можно не указывать тип возвращаемых данных. Однако компилятор в этом случае выносит предупреждение.
Функция printf() предназначена для вывода данных. Ее назначение аналогично функции print() в Python. Однако функция printf() после вывода не выполняет переход на новую строку. Поэтому для перехода используется специальный символ, который обозначается комбинацией \n.
Выражения на языке C разделяются точкой с запятой.
В языке C функции ввода-вывода не являются частью языка. Например, в Python нам не надо импортировать никакой модуль, чтобы пользоваться функциями print() и input(). В C мы не можем просто вызвать функцию printf(), т. к. в самом C ее просто нет. Эту функцию, а также ряд других, можно подключить с помощью заголовочного файла stdio.h. Именно для этого в начале программы прописана строка . Include с английского переводится как «включить», а stdio есть сокращение от «стандартный ввод-вывод (input-output)».
В заголовочных файлах (они оканчиваются на *.h) обычно содержаться объявления тех или иных функций. Объявление — это просто описание функции: какие параметры она принимает и что возвращает. Сам код функции (определение) находится не в заголовочном файле, а в библиотеках (других файлах), которые могут быть уже скомпилированы и расположены в системных каталогах. Перед компиляцией программы запускается препроцессор языка C. Помимо прочего он включает в начало файла программы содержимое указанных в ней заголовочных файлов.
Закомментируйте1 первую строчку кода программы HelloWorld. Попробуйте скомпилировать программу. Удалось ли получить исполняемый файл? Какое предупреждение выдал компилятор?
1 // — однострочный комментарий на языке C; /* … */ — многострочный комментарий на языке C.
Hello world
Под узлом «Зависимости» расположен непосредственно сам файл кода программы — Program.cs. Как раз он и открыт в центральном окне. Вначале разберёмся, что весь этот код собой представляет:
using System; namespace HelloWorld { class Program { static void Main(string args) { Console.WriteLine("Hello World!"); } } }
В начале файла мы видим директиву using, после которой идёт название подключаемого пространства имён. Пространства имён необходимы для организации классов в общие блоки. Например, в первой строке подключается пространство имён System, которое содержит фундаментальные и базовые классы платформы .NET.
C# имеет C-подобный синтаксис, и каждая строка завершается точкой с запятой, а каждый блок кода помещается в фигурные скобки. Далее начинается уже наше пространство имён HelloWorld, которое будет создавать отдельную сборку или исполняемую программу. Сначала идёт ключевое слово namespace, после которого следует название пространства имён. По умолчанию Visual Studio даёт ему название проекта. Далее внутри фигурных скобок идёт блок пространства имён.
Пространство имён может включать другие пространства или классы. В нашем случае по умолчанию сгенерирован один класс — Program. Классы объявляются похожим способом: сначала идёт ключевое слово class, а потом название класса, и далее блок самого класса в фигурных скобках.
Класс может содержать различные переменные, методы, свойства, прочие инструкции. В данном случае объявлен один метод Main. В программе на C# метод Main является входной точкой программы, с него начинается всё управление. Это обязательный элемент любой программы.
Слово static указывает, что метод Main статический, а слово void — что он не возвращает никакого значения. Далее в скобках у нас идут параметры метода. string[] args — это массив с именем args, который хранит значения типа string, то есть строки. В данном случае они нам пока не нужны, но в реальной программе это те параметры, которые передаются при запуске программы из консоли.
Внутри метода располагаются действия, которые этот метод выполняет. По умолчанию он содержит одно действие: Console.WriteLine(«Hello World!»); — выводит в консоль строку «Hello World!».
Теперь мы можем запустить программу на выполнение с помощью клавиши F5 или с панели инструментов, нажав на зелёную стрелку. И если вы все сделали правильно, то при запуске приложения увидите заветную строку.
SharpDevelop IDE
SharpDevelop — это IDE с открытым исходным кодом для проектов на платформе Microsoft .NET. В SharpDevelop возможно программирование на языках C #, VB.NET, F #, IronPython и IronRuby, а также целевые и расширенные возможности: Windows Forms или WPF, а также ASP.NET MVC и WCF.
Может запускаться с USB-накопителя, поставляется с интегрированными инструментальными средствами и инструментами для тестирования производительности, Git, NuGet. Имеет множество функций, которые повышают производительность труда разработчика. Это IDE с открытым исходным кодом, можно свободно скачать исходный код и исполняемые файлы c сайта загрузки. SharpDevelop имеет мощный интегрированный отладчик, включая динамические функции отладки, предоставляет возможность модульного тестирования и анализа кода.
- Поддерживаемые языки программирования
- C # (Windows Forms Designer)
- VB.NET (Windows Forms Designer)
- Boo (Windows Forms Designer)
- IronPython (Windows Forms Designer)
- IronRuby (Windows Forms Designer)
- F#
- Каркасы приложений, Frameworks
- Windows Presentation Foundation (WPF)
- Windows Forms
- ASP.NET MVC
- Entity Framework (EF EDM Designer)
- Производительность труда разработчиков
- Функция завершения кода подобная IntelliSense
- Рефакторинг (пакетное переименование, улучшение структуры кода)
- Параллельная поддержка сборки для многоядерных машин
- Поддержка пакетов NuGet и T4
- Автоматическая вставка кода
- Запуск с карты памяти USB
- поддержка чтения проект (Подробнее)
- Полная поддержка MSBuild (платформа сборки проекта)
- Инструменты
- Встроенный отладчик (в том числе динамические особенности отладки)
- Анализ кода
- Модульное тестирование (NUnit)
- Встроенная поддержка Git
Проекты, созданные в Visual Studio, вы можете открывать и редактировать в SharpDevelop и наоборот. Бесплатная среда программирования SharpDevelop предназначена для создания и редактирования любительских и коммерческих проектов. Отлично спроектированная среда разработки SharpDevelop может использоваться как альтернатива Visual Studio .NET Community.
Компиляторы COBOL
Компилятор | Автор | Окна | Unix-подобный | Другие ОС | Тип лицензии | IDE ? |
---|---|---|---|---|---|---|
IBM COBOL | IBM | да | AIX , Linux | z / OS , z / VM , z / VSE | Проприетарный | IBM Developer для z / OS |
NetCOBOL | Fujitsu , GTSoftware | да | да | Нет | Проприетарный | да |
GnuCOBOL (ранее OpenCOBOL) |
Кейсуке Нисида , Роджер Уайт , Саймон Собиш |
да | да | да | GPL | OCIDE , HackEdit (альфа) |
Визуальный КОБОЛ | Микро Фокус | да | да | да | Проприетарный | да |
isCOBOL Evolve | Veryant | да | да | да | Проприетарный | Затмение |
MCP | Unisys | Нет | Нет | MCP | Проприетарный | КАНДА |
HP COBOL | Фирма Хьюлет-Паккард | Нет | Нет | OpenVMS | Проприетарный | NetBeans |
Аустек Кобол | Эсмонд и Дэвид Питт и Дерек Траслер, Austec International Inc. | Нет | да | да | Проприетарный | Нет |
XCode
Описание: IDE, ориентированная на создание приложений для OS X и iOS. Для использования языков Objective C и Swift на сегодня это лучшее, а для некоторых задач и вовсе единственное решение.
Недостатки: многие разработчики жалуются на стабильность среды, вынуждающую вносить дополнительные изменения в свои проекты после выхода очередной версии. Кроме того, XCode относительно сложная IDE для самопознания новичком. Именно поэтому рекомендуем вам пройти наш бесплатный интенсив по основам языка Swift. На нем мы рассмотрим тонкости работы с этой IDE.
От официальных представителей перейдём к универсальным кроссплатформенным средам разработки:
Поиск по имени
Наше путешествие начинается с выражения вызова функции. Возьмем, к примеру, выражение из кода ниже. Это выражение явно предназначено для вызова функции с именем . Но какой?
Первый шаг к ответу на этот вопрос — поиск функции по имени (name lookup). На этом этапе компилятор просматривает все функции и шаблоны функций, которые были объявлены до этого момента, и выбирает те, которые могли бы соответствовать заданному имени.
Как видно из блок-схемы, существует три основных типа поиска имени, каждый со своим собственным набором правил.
-
Поиск имени по методам (Member name lookup) происходит, когда имя находится справа от токена или , как в . Этот тип поиска используется для поиска методов класса.
-
Поиск квалифицированного имени (Qualified name lookup) происходит, когда имя содержит токен , например, . Этот тип имени является явным для компилятора. Часть справа от токена ищется только в области видимости, обозначенной в левой части.
-
Поиск неквалифицированных имён (Unqualified name lookup) не является ни тем, ни другим. Когда компилятор видит неквалифицированное имя, например , он ищет совпадающие декларации функций в множестве различных областей в зависимости от контекста. Существует подробный набор правил, который точно определяет, где должен искать компилятор.
В нашем случае функция имеет неквалифицированное имя. Теперь, когда поиск имени выполняется для выражения вызова функции, компилятор может найти несколько объявлений для неё. Назовем все эти объявления кандидатами. В приведенном выше примере компилятор находит трех кандидатов:
Первый кандидат заслуживает особого внимания, потому что он демонстрирует особенность C++, которую легко пропустить: поиск, зависящий от аргумента, или argument-dependent lookup или ADL для краткости. Признаюсь, большую часть своей карьеры C++ я не знал о роли ADL в поиске имен. Вот краткое изложение на тот случай, если вы находитесь в одной лодке со мной. Обычно вы не ожидаете, что эта функция будет кандидатом на этот конкретный вызов, так как она была объявлена внутри пространства имен , а вызов происходит снаружи — за пределами пространства имен . В коде также нет директивы , чтобы сделать эту функцию видимой в текущем месте. Так почему эта функция является кандидатом?
Причина в том, что каждый раз, когда вы используете неквалифицированное имя в вызове функции — и имя, помимо прочего, не относится к методу класса, — срабатывает ADL, и поиск имени становится более жадным. В частности, в дополнение к обычным местам, компилятор ищет функции-кандидаты в пространствах имен типов аргументов — отсюда и название «поиск, зависимый от аргументов».
Полный набор правил, регулирующих ADL более детализирован, чем то, что я описал здесь, но ключевым моментом является то, что ADL работает только с неквалифицированными именами. Для полных имен, которые ищутся в определённой области, смысла в ADL нет. Он также работает при перегрузке встроенных операторов, таких как и , что позволяет нам использовать его преимущества при написании, скажем, математической библиотеки.
Интересно, что бывают случаи, когда поиск по методу может найти кандидатов, которых не может найти неквалифицированный поиск имени. См. этот пост Eli Bendersky для получения подробной информации об этом.