LINUX.ORG.RU

g++, STL, они используют обфускатор?


0

0

  template<typename _Key, typename _Value,
           typename _Allocator, typename _ExtractKey, typename _Equal,
           typename _H1, typename _H2, typename _Hash, typename _RehashPolicy,
           bool __chc, bool __cit, bool __uk>
    typename _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal,
                        _H1, _H2, _Hash, _RehashPolicy,
                        __chc, __cit, __uk>::iterator
    _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal,
               _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>::
    find(const key_type& __k)
    {
      typename _Hashtable::_Hash_code_type __code = this->_M_hash_code(__k);
      std::size_t __n = this->_M_bucket_index(__k, __code, _M_bucket_count);
      _Node* __p = _M_find_node(_M_buckets[__n], __k, __code);
      return __p ? iterator(__p, _M_buckets + __n) : this->end();
    }

Для чего столько подчёркиваний?


Перемещено JB из Talks
★★★★★

чтоб минимизировать вероятность конфликта с макросом, определённым пользователем. Стандарт явно указывает что имена с подчёркиваниями зарезервированы для системных билиотек, и по идее такие макросы определны быть не должны.

GPFault ★★
()
Ответ на: комментарий от Legioner

Хотя, судя по выравниваниям - сразу. Спасибо, будем страдать :)

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

> Или они сразу так пишут?

Это С++.

anonymous
()
Ответ на: комментарий от GPFault

> чтоб минимизировать вероятность конфликта с макросом, определённым пользователем.

Не путайте теплое с мягким, шаблон это не макрос, и у всех его аргументов область видимости ограничена определением шаблона, а если имеются аналогичные имена в каком-либо из доступных пространств имен, - они затеняются для шаблона, но это никак не влияет на раскручиваемость самого шаблона.

К вопросу "зачем" - тут я не могу сказать ничего конкретного, видимо "так принято", стало привычным стилем, как раз со времен макросов, называть с кучей подчеркиваний.

quarck
()
Ответ на: комментарий от quarck

Не, всё правильно, если я напишу

#define _Key something funny like syntax error
#include <tr1/hashtable>

то будет неприятность. И правильно, ибо сказано в стандарте, не дефайнь идентификаторы с подчёркиванием. А если бы использовалось имя Key и я написал бы

#define Key something funny like syntax error
#include <tr1/hashtable>

то с одной стороны компилятор бы такое не одобрил, с другой стороны стандарта я не нарушил и вправе рассчитывать на нормальную компиляцию.

Проблему решает: a) включение системных заголовков перед всеми остальными; b) extern template-ы. Первый вариант используют все нормальные люди, но стандарт этого не требует (может зря). Второй вариант вроде не поддерживается gcc.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

c) использование только ТАКИХ_ИМЁН для макросов, но это тоже не требуется стандартом, хоть это и делают большинство нормальных людей.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

>А есть эти же исходники, но в более читабельном виде где-нибудь? Или они сразу так пишут?

Первая реализация STL с которой я имел дело была SGI STL for VC5. Оно было написаны в человеческом читаемом стиле. Позже видимо решили это дело обфусцировать зачем-то.

Absurd ★★★
()
Ответ на: комментарий от Legioner

> то будет неприятность. И правильно, ибо сказано в стандарте, не дефайнь идентификаторы с подчёркиванием. А если бы использовалось имя Key и я написал бы

А, ну да... Честно говоря уже забыл о том, что кто-то до сих пор использует макросы, дикари-сс.. Хотя сам нарывался на макрос с именем "max" в apple-овских системных хедерах, а потом долго ох...вал от многоэтажного мата gcc, на обьявление inline метода класса с именем "max".

quarck
()
Ответ на: комментарий от quarck

>Хотя сам нарывался на макрос с именем "max" в apple-овских системных хедерах, а потом долго ох...вал от многоэтажного мата gcc, на обьявление inline метода класса с именем "max".

Делал где-то в тредовом коде виртуальный метод Sleep(). Напоролся на #define Sleep SleepEx в недрах windows.h. Долго думал.

Absurd ★★★
()
Ответ на: комментарий от Legioner

2Legioner - у вас в ЖЖ была выложена ссылка на ифолдер с исходниками схемы, написанной на D. (если я правильно понял, т.к. комментариев там нет). можно скопировать тот архив в более доступное место?

bik ★★
()
Ответ на: комментарий от GPFault

> s/имена с подчёркиваниями/имена начинающиеся с подчёркиваний

зарезервированы имена начинающиеся с _двух_ подчеркиваний, либо подчеркивание+капитальная буква. Имена начинающиеся с подчеркивания+строчная буква не зарезервированы

dilmah ★★★★★
()
Ответ на: комментарий от bik

> А, ну да... Честно говоря уже забыл о том, что кто-то до сих пор использует макросы, дикари-сс.. Хотя сам нарывался на макрос с именем "max" в apple-овских системных хедерах,

Ага. Да что там дикари - нелюди какие-то. Trolltech, например. Дикие горные чудовища. А так, вообще-то, во всех системных хедерах, которые я видел, макросов просто море и никто их оттуда не собирается убирать. Однако, тенденция...

den73 ★★★★★
()
Ответ на: комментарий от bik

http://vsb.name/files/scheme4d.tar.bz2

Сразу предупреждаю, оно совершенно неюзабельно. Если вдруг придёт в голову странная идея использовать это для чего-нибудь, считайте что оно в Public Domain.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Absurd

> Первая реализация STL с которой я имел дело была SGI STL for VC5. Оно было написаны в человеческом читаемом стиле. Позже видимо решили это дело обфусцировать зачем-то.

позже пришёл GNU coding style. если ему следовать, то действительно можно и не пользоваться отдельным обфрускатором.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

ну так его рождали зубры вроде столмана. они не только обфусцированый код читать могут. они могут трипл дэс в мысленно расшифровывать.

eXOR ★★★★★
()
Ответ на: комментарий от klalafuda

>позже пришёл GNU coding style. если ему следовать, то действительно можно и не пользоваться отдельным обфрускатором.

В этом и недостаток принудительного опенсурца типа GNU GPL. Если выкладывать заобфускейченные исходники то формально лицензия не нарушается, но пользоваться ими невозможно.

Alviss
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.