0

Есть определение типа:

void foo() {
    /* ... */
}

Почему можно вызвать foo;, то есть без скобок, когда правильно именно foo();?

Мой компилятор не запрещает такой вызов, а просто выводит warning.

Я не могу понять, это альтернативный метод вызова, или раньше планировалось это как-то применять, но потом передумали?

Harry
  • 221,325
  • Возможно, такой вопрос, и даже неоднократно, уже задавали. Но я не смог найти, или подобрать формулировку для поиска. – Aleksey Jan 08 '20 at 18:57
  • для проверки "на всех компиляторах" https://godbolt.org/z/ikMLdN – IR42 Jan 08 '20 at 19:14
  • Drawn Raccoon огромное спасибо, это еще asm код приводит. Такого в online я еще не находил... – Aleksey Jan 08 '20 at 19:16

1 Answers1

3

Потому что это не вызов.

Это просто выражение, которое имеет в качестве значения указатель на функцию. Примерно как если бы вы написали

int x = 5;

x; 5;

Это у вас никаких возражений не вызывает? Просто особого смысла нет... и не более того.

Harry
  • 221,325
  • То есть, если я пишу foo; то у меня не выполняется код из foo? – Aleksey Jan 08 '20 at 18:58
  • А вы что, сразу бросились спрашивать и даже не проверили?! 8-/ Конечно, нет. – Harry Jan 08 '20 at 18:59
  • Ну тогда зачем оно нужно? Вот в чем смысл вопроса? То есть, компилятор знает что такое foo, и разрешает foo; Зачем? – Aleksey Jan 08 '20 at 19:00
  • Подождите, ну указатель то понятно, но его нужно обрабатывать же, то есть, одно дело когда это где-то используется, а другое простоfoo; – Aleksey Jan 08 '20 at 19:03
  • А вы что, сразу бросились спрашивать и даже не проверили У меня же нет возможности проверить это на всех компиляторах...

    – Aleksey Jan 08 '20 at 19:04
  • Компилятор разрешает выражения без присваивания? Например, z = bar(x); и просто bar(x)? Тогда почему бы не разрешить просто foo;, если разрешено f = foo;? К чему плодить лишние сущности?... – Harry Jan 08 '20 at 19:04
  • Хорошо, а сточки зрения asm, куда перейдет этот foo; Это NOP? – Aleksey Jan 08 '20 at 19:05
  • А проверить - да хоть на одном-единственном. Вот, например - https://ideone.com/onLAof – Harry Jan 08 '20 at 19:05
  • Harry, у меня почти такой же код. Я проверил что вызова нет, но вот зачем 'foo;' в чистом виде, ладно любое использование, а то просто оператор. – Aleksey Jan 08 '20 at 19:07
  • А вот это уже - ассемблерный код - зависит от конкретной реализации. Думаю, что его просто не будет вообще, ни в какой инструкции. – Harry Jan 08 '20 at 19:08
  • Так а все же, если foo; без использования, он заменяется на NOP или опускается? – Aleksey Jan 08 '20 at 19:08
  • Уже ответили... – Aleksey Jan 08 '20 at 19:08
  • Спасибо, вопрос удаляю, мне правда стыдно спрашивать, но я хочу разобрать все, что я не понимаю, и хорошо если бы был форум с такой темой, типа вопросы нубов и т. д. Но форумы, которые я читаю, предлагают создавать новую тему... – Aleksey Jan 08 '20 at 19:10
  • Harry, спасибо еще раз... – Aleksey Jan 08 '20 at 19:11
  • Harry, я хотел задать вопрос в чате, чтобы не засорять RU StackOverflow, но не хватает репутации ( Может посоветуете литературу, что читать начинающему? Знаю что есть много книг, но говорят стандарт меняется, поэтому хочется понимать основы, но чтобы это не было устаревшим. – Aleksey Jan 08 '20 at 19:14
  • Посмотрите тут: https://ru.stackoverflow.com/questions/454263/%D0%9A%D0%BD%D0%B8%D0%B3%D0%B8-%D0%B8-%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B5-%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B-%D0%BF%D0%BE-%D0%A1 – Harry Jan 08 '20 at 19:16
  • Спасибо, выписал несколько авторов: Бьерн Страуструп, Брюс Эккель, Стенли Липпман из серии для начинающих. Понять бы еще, Какая из 5-ти книг больше на новичка. Попробую разобраться, заодно может добавлю комментарий в ту тему ;) откуда вынес больше пользы... – Aleksey Jan 08 '20 at 19:25
  • Ну, если совсем уж с нуля - то скорее Дэвис или Рао... – Harry Jan 08 '20 at 19:27
  • Хорошо, приму Ваш совет, знаний у меня и правда почти 0... – Aleksey Jan 08 '20 at 19:28