Может ли функция не иметь имени?

81
03 мая 2021, 05:00

Может ли функция не иметь имени?

Answer 1

Вряд ли это то, что вас интересует, но в DLL функция может идентифицироваться не только по имени, но и по ординалу (или только по ординалу. По крайней мере в OS/2 это было именно так).

Таким образом, можно получит адрес и вызвать функцию, не упоминая ее имя, только некоторый номер. Правда, его тоже можно считать именем... И ее адрес в памяти тоже можно считать именем. Решать вам - это то, что вы хотели или нет :) И вообще - точно скажите, что вы под этим - именем - подразумеваете.

Например, функция в библиотеке в безымянном пространстве имен - но адрес которой возвращает другая функция. Считать ли такую функцию (имя которой вам принципиально неизвестно, но вызвать которую вы в состоянии) безымянной?

Что касается чисто языковых возможностей - то по сути любой объект имеет имя, которое, правда, может быть - как в случае лямбда-выражений - недоступно пользователю.

Но допустим, что такая возможность была бы доступна. Что бы это изменило? Просто имя функции заменилось бы адресом, который бы играл роль этого имени, нет?

Словом, было бы хорошо, если бы вы уточнили свой вопрос, а то, знаете, без точного ТЗ результат один - ХЗ...

Answer 2

Ну в принципе, так как в С++ можно привести любой тип к любому типу, то можно тупо взять абсолютный адрес памяти и привести его к типу функции. А потом вызвать эту функцию по указателю. Будет как-бы вызов функции без имени. Но только надо знать адрес функции в памяти. В системах типа десктопа знать адрес функции в памяти сложно, но можно (это требует рассмотрения карты памяти, которую генерирует линкер). Во встроенных системах (без MMU, колец защиты и виртуальной памяти) это проще, но тоже требует рассмотрения карты памяти. А можно дизассемблировать свой или чужой код в рантайме и искать какие-то признаки начала функций. А потом передавать туда управление. Хорошее занятие для вирусописателей, кстати.

UPD1:

Опять же в принципе все объекты в программе имеют имя и тип. Это, так сказать, "синтаксический сахар", так как человеку удобнее работать с поименованными объектами. Трансляторы и создавались в том числе для того, чтобы работать с именами, а не с кодами и адресами. Так что в общем случае вопрос должен звучать так: "может ли какой-то объект в программе (функция, массив, структура) не иметь имени". Ответ на этот вопрос - может, но зачем? Можно программировать в кодах и тогда у Вас не будет вообще никаких имен в программе. :-)

Answer 3

Может. Конструкторы не имеют имен:

15.1 Constructors [class.ctor]
1 Constructors do not have names.

Answer 4

Может. Лямда-функция. Обычная не может.
Сама по себе безымянная функция бессмысленна, так как к ней невозможно будет обратиться. Нужно либо имя, либо какой-то иной механизм вызова. Например, лямда-функция, привязанная к указателю на функцию или к слоту (если говорить о qt)

READ ALSO
Non-static class function - pointer

Non-static class function - pointer

В ранних версиях Android NDK использовался gnustl

110
Размытие шрифта при установки значения bold

Размытие шрифта при установки значения bold

Слева требуемы результат, справа как получается у меня:

114
Как использовать модальное окно регистрации Bootstrap с django

Как использовать модальное окно регистрации Bootstrap с django

Я недавно в программировании, и у меня возник вопросЯ нашел подходящую модалку в инете которую я скопировал и вставил но не знаю как привязать...

98
Не работает стиль (CSS) на моем сайте

Не работает стиль (CSS) на моем сайте

Я пишу проект и хочу добавить стиль чтобы все было ровно (шаблон меню) но почему то он не читает CSS файл и папку images Остальные стили читает кроме...

91