Существует хорошая причина, по которой стандартная библиотека запускает внутренние имена с двумя символами подчеркивания: такие имена зарезервированы для реализации.
Представьте, что вы написать следующий код:
#include <iostream>
using namespace std;
long square(long x)
{
return x*x;
}
int main()
{
cout << square(3) << endl;
}
Я думаю, вы не были бы счастливы, если это в конечном итоге вызывая некоторую внутреннюю функцию square(int)
, используемые в реализации стандартной библиотеки и делать что-то совсем другое, потому что это лучше чем ваш square(long)
для square(3)
.
Префикс всех внутренних имен с двойными подчеркиваниями и в то же время стандарт, объявляющий, что вам не разрешено делать то же самое, авторы стандартной библиотеки гарантируют, что что-то подобное не может произойти.
Теперь вы можете сказать, что <iostream>
не является частью STL, но каждый стандартный заголовок библиотеки может включать любой другой стандартный заголовок библиотеки, поэтому iostream
вполне может включать заголовок STL для использования в его реализации.
Другая причина, по которой идентификаторы с двойными подчеркиваниями имеют смысл даже в случае локальных идентификаторов, которые внешне не видны, так это то, что вы могли бы определить макрос с тем же именем. Рассмотрим:
#define value 15
#include <iostream>
int main()
{
std::cout << value;
}
Это юридический код и, конечно, должен вывести 15. А теперь представьте, что произошло, если какой-то предмет в iostream
объявлен имена локальных переменных value
. Ваш код, очевидно, не будет компилироваться.
Обратите внимание, что стандартная библиотека является частью реализации (в конце концов, она описана в стандарте C++), поэтому она может использовать зарезервированные имена, но она нравится.
Это не злоупотребление, реализация _shall_ использует зарезервированные идентификаторы. – edmz
Стандартная библиотека * является * частью «реализации». Он определен в спецификациях C и C++, как и сами языки. –
Это явно не дубликат http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier. Речь идет о том, в чем причина двойных undescores в реализациях stdlib. «Хотя шальт» не является хорошей причиной, если вы не овцы. Обеспечение того, что пользовательский макрос с юридическим идентификатором никогда не столкнется с заголовком stdlib. – PSkocik