2015-09-27 5 views
-4

Есть ли какая-либо техническая причина для реализации стандартной библиотеки (C или C++), злоупотребление IMO, подчеркивает то, как они это делают (= префикс все с двумя undescore + добавить нижнее подчеркивание, чтобы обозначить это переменная является переменной-членом)?Причины четырех двойных разрядов в стандартных реализациях библиотек

Получаю, что /.*__.*/ и /_[A-Z].*/ (< = regexes) зарезервированы по реализации. Но разве это не должно ссылаться на реализацию компилятора, а не на (стандартную) библиотеку?

Не может ли стандартная библиотека вести себя как любая другая библиотека с точки зрения выбора ее внутренних имен?

+1

Это не злоупотребление, реализация _shall_ использует зарезервированные идентификаторы. – edmz

+8

Стандартная библиотека * является * частью «реализации». Он определен в спецификациях C и C++, как и сами языки. –

+0

Это явно не дубликат http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier. Речь идет о том, в чем причина двойных undescores в реализациях stdlib. «Хотя шальт» не является хорошей причиной, если вы не овцы. Обеспечение того, что пользовательский макрос с юридическим идентификатором никогда не столкнется с заголовком stdlib. – PSkocik

ответ

3

Существует хорошая причина, по которой стандартная библиотека запускает внутренние имена с двумя символами подчеркивания: такие имена зарезервированы для реализации.

Представьте, что вы написать следующий код:

#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++), поэтому она может использовать зарезервированные имена, но она нравится.

+0

Ответы на плохие вопросы не полезны. Пожалуйста, прочитайте сообщение Джорджа Камминса [здесь] (https://meta.stackoverflow.com/questions/252506/question-quality-is-dropping-on-stack-overflow). – edmz

+0

Существуют статические функции (= анонимные функции пространства имен), чтобы предотвратить столкновения в глобальной области. Это также занимает пространство имен std. Для членов структуры/класса есть частные. На мой взгляд, множество двойных нежелательных явлений. – PSkocik

+3

@black: Этот вопрос явно не попадает в категорию «механический турк».Я также не согласен с тем, что это плохой вопрос. – celtschk