LINUX.ORG.RU

Передать void в функцию

 , ,


0

1

Когда ньюфаги пишут, что функция void f(<неважно>) ничего не возвращает, то их поправляют: «нет, вы не правы, ньюфаги, эта функция возвращает void».

Отсюда можно сделать вывод, что тип void в C/C++ это тип-синглтон, т.к. именование типа и значения одним ключевым словом обычно говорит о том, что значение единственно. См. тип () в Haskell.

Тогда почему нельзя создавать переменные типа void (НЕ указатель на него!) и передавать их в функции, принимающие void? Это бы позволило создавать композиции функций: g(f(<аргументы для f>)), где

void f(<параметры f>);
<возвращаемый тип g> g(void);
не рассматривая void как частный случай при композиции.

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

vertexua ★★★★☆ ()

Сейлор анонiмус снова с нами.

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

В C у пустых структур sizeof() == 0. Что не мешает создавать переменные типа пустой структуры, брать адрес этих переменных и передавать их в функции.

anony_mouse ()

Отсюда можно сделать вывод, что тип void в C/C++ это тип-синглтон

Почему синглтон-то? У него пустое множество значений.

nezamudich ★★ ()

Когда ньюфаги пишут ... то их поправляют

После чего поправляющих игнорируют. Мало ли разных идиотов со своим единственно-верным мнением.

Отсюда можно сделать вывод, что тип void в C/C++ это тип-синглтон

А если добавить еще немного веществ, то можно сделать вывод что это крылатая пони.

Тогда почему нельзя создавать переменные типа void

Что такое «переменная» по-твоему?

Это бы позволило создавать композиции функций: g(f(<аргументы для f>))

Но зачем?

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

В некоторых языках, например в Scala, есть силнглтон None, он вполне себе обьект, вполне с адресом и вполне себе один.

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

Мало ли разных идиотов со своим единственно-верным мнением.

Немало. Вот ты один из них. А у нормальных людей стандарт говорит про «function returning void».

Но зачем?

не рассматривая void как частный случай при композиции.

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

Немало. Вот ты один из них. А у нормальных людей стандарт говорит про «function returning void».

Нормальные люди не цепляются к словам когда это не меняет смысла. «Возвращает „ничего“» и «ничего не возвращает» в русском языке является синонимами.

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

например в Scala, есть силнглтон None, он вполне себе обьект, вполне с адресом и вполне себе один.

Аналогом void в Scala будет скорее Unit. None - это артефакт, порождённый отсутствием поддержки ADT на уровне языка.

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

Это понятно, просто вопрос в теме поставлен таким образом, «Поему void в С++ это как Unit, а не как None (кроме того факта что None:Option[Nothing], а как просто None)»

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

Это понятно, просто вопрос в теме поставлен таким образом, «Поему void в С++ это как Unit, а не как None (кроме того факта что None:Option[Nothing], а как просто None)»

Мы с тобой разные темы читаем? Я этого тут не вижу. ТС спрашивал, почему в C void не используется как unit. Ответом будет тот факт, что авторы C/C++ мало что слышали о теории типов. Плюс, void появился далеко не сразу. Добавь к этому любовь авторов C/C++ к костылям в языке, и мы получаем то что имеем.

hateyoufeel ★★★★★ ()
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от morse

«Возвращает „ничего“» и «ничего не возвращает» в русском языке является синонимами.

Ну вот программируй на русском языке. Тут же обсуждается язык C.

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

Ничем. Просто если, допустим, есть шаблонная функция comp, которая принимает 2 функции и возвращает их композицию, то зачем-то надо отдельно заботиться о том, когда первая функция в композиции возвращает void.

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

Ничем. Просто если, допустим, есть шаблонная функция comp, которая принимает 2 функции и возвращает их композицию, то зачем-то надо отдельно заботиться о том, когда первая функция в композиции возвращает void.

Я выше ответил на это.

hateyoufeel ★★★★★ ()

В си и с типами, и с формулировками печально. «Возвращает void» вообще оксюморон. В плюсах void чуть-чуть лучше, но всё равно нет.

именование типа и его единственного значения одним ключевым словом это признак синглтона

А само по себе единственное значение - это еще не признак синглтона?

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

Ответом будет тот факт, что авторы C/C++ мало что слышали о теории типов.

Ну что-то они всё же слышали. Раз знают, что константность нельзя просто так сбрасывать при касте поинтеров. Или что просто так кастовать можно к указателю на базовый, а не наоборот.

void появился далеко не сразу.

void вроде сразу был, это указатель на него ввели при стандартизации.

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

А само по себе единственное значение - это еще не признак синглтона?

Неточно выразился. Именование типа и значения одним словом говорит о том, что это значение единственно, т.е. это тип-синглтон.

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

Константность и наследование - это к Страуструпу, это он кое-что знал. А в K&R void не было, потому и говорят с тех пор будто процедур в языке нет, и int by default оттуда же растет.

anonymous ()

Максимум, что ты можешь сделать, это:

void g(void);
void f(void)
{
    ...
    return g();
}
anonymous ()
Ответ на: комментарий от anony_mouse

void вроде сразу был, это указатель на него ввели при стандартизации.

https://ru.wikipedia.org/wiki/Void

Среди современных языков программирования ключевое слово void впервые появилось в Си++ для поддержки концепции обобщенных указателей. Тем не менее, благодаря скорому заимствованию у Си++, первым нормативным документом, содержащим это ключевое слово, стал стандарт языка Си, опубликованный ANSI в 1989 г. В рамках языка Си++ void был стандартизован в 1998 г.

hateyoufeel ★★★★★ ()

Я понял, что это анонiмус, с двух предложений.

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

Среди современных языков программирования ключевое слово void впервые появилось в Си++ для поддержки концепции обобщенных указателей.

Если уж трясти вики"знаниями", то английская пишет

By the time Bjarne Stroustrup began his work on C++ in 1979–1980, void and void pointers were part of the C language dialect supported by AT&T-derived compilers.

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

By the time Bjarne Stroustrup began his work on C++ in 1979–1980, void and void pointers were part of the C language dialect supported by AT&T-derived compilers.

Ага, и? В других компиляторах их не было, и язык к тому времени был достаточно развит и широко использовался. В любом случае, суть в том, что void был запилен как костыль.

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

Ага, и?

Это расходится с твоей цитатой про «void впервые появился в C++ и потом попал в C»

anony_mouse ()

Как раз-таки в С void обозначает отсутствие типа. Тип без значений - это Unit в Scala, а тип, содержащий единственное значение - Option[T].

LongLiveUbuntu ★★★★★ ()
Ответ на: Нет от LongLiveUbuntu

Re: Нет

В Unit ровно одно значение. В Option[T] значений на единицу больше чем в T. Теперь ты читай.

hateyoufeel ★★★★★ ()

Следующим шагом будет захотеть std::vector<void>, а потом template<> T<void> для выражения абстрактных действий с побочными эффектами, а потом захотеть сборщик мусора встроенный, а потом... ссылочную прозрачность или еще чего. А затем возникнет вопрос, а нафига писать на Си и Си++, если есть другие языки, где это все уже есть, или почти все, кроме низкоуровневых оптимизаций)

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

Следующим шагом будет захотеть std::vector<void>

Почему бы и нет?

а потом template<> T<void> для выражения абстрактных действий с побочными эффектами

Ты прям прочитал мои мысли. Я хотел написать, что возврат/получение синглтона — хороший способ помечать функции с побочными эффектами.

потом захотеть сборщик мусора встроенный

Нет, тут уж спасибо, не надо.

anony_mouse ()

Можно еще вспомнить разницу между

void f();
и
void f(void);

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

Только void это не как Unit

scala> val x: Unit = ()
x: Unit = ()

scala> def foo(x: Unit): Unit = println("foo")
foo: (x: Unit)Unit

scala> def bar(y: Int): Unit = println(s"bar $y")
bar: (y: Int)Unit

scala> foo(bar(42))
bar 42
foo
Zenom ★★★ ()
Ответ на: комментарий от Zenom

Тут не совсем честный Unit. Тут больше неявный IO[Unit], строго говоря.

dave ★★★★★ ()

Когда ньюфаги пишут, что функция void f(<неважно>) ничего не возвращает, то их поправляют: «нет, вы не правы, ньюфаги, эта функция возвращает void».

Поправляющие ламеры, потому что утверждения эквивалентны. Остальное - бредок-с.

slovazap ★★★★★ ()

Void фция возвращает результат в аккумуляторе, которьій благополучно игнорируется. В с нету типов, там структурьі с офсетами /тред

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

void был придуман для того, чтобы пояснить что функция ничего не возвращает. Ибо если ничего не написано - то подразумевается int. См. старые книги K&R.

Deleted ()

Когда ньюфаги пишут, что функция void f(<неважно>) ничего не возвращает, то их поправляют: «нет, вы не правы, ньюфаги, эта функция возвращает void».

Ни разу не видел таких поправлений.

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