LINUX.ORG.RU

sizeof для функций это заглушка, оно просто вернёт 1 как в случае с void. К слову не стоит путать с sizeof(test()) sizeof(&test) и подобным это вообще иное! И да, скомпилируй с -Wall -pedantic и станет яснее

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от anonymous

sizeof(void)

1 The sizeof operator shall not be applied to an expression that has … an incomplete type

anonymous
()

А что именно ты хочешь узнать? Тебе вернули размер одного байта. Потому что void это фактически байт. А вот sizeof(void*) будет уже интереснее, например так sizeof(&test).

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

Тебе вернули размер одного байта. Потому что void это фактически байт.

Ты как из дурки выбрался?

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

Нормальные компиляторы уже следуют: https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/compiler-error-c2070?view=vs-2019

Код автора просто не компилируется в Visual Studio C и С++

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

Clang в С++ даёт ошибку:

test.cpp:4:24: error: invalid application of 'sizeof' to a function type
        printf("%zu\n", sizeof(main));
                              ^~~~~~

В С даёт предупреждение:

test.c:4:24: warning: invalid application of 'sizeof' to a function type [-Wpointer-arith]
        printf("%zu\n", sizeof(main));
                              ^~~~~~
fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

Да с опцией -pedantic такой warning выдает

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

Тебе вернули размер одного байта. Потому что void это фактически байт.

Я удваиваю вопрос анонима про дурку. Как тип «нет типа» может иметь хоть какой-то размер? Может у него и значения есть?

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

sizeof или ее аналоги вводятся в языки для ручного аллокирования объектов, например на куче или в массиве байт или еще где. чтобы знать какой размер надо выделить в памяти под данный обьект и чтобы он точно туда вместился. функцию аллокировать нельзя(фактически надо аллокировать ее код), по крайней мере в тех языках где код и данные разделены. потому брать size от функции - бессмыслица, по идее компилятор или должен ругаться или давать варнинг и давать ноль. и еще результат sizeof должен быть известен на этапе компиляции.

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

Потому что расширение языка от вендора компилятора.

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

В C (99) — не должен.

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

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

Я удваиваю вопрос анонима про дурку.

Не в ту сторону удваиваешь.

Как тип «нет типа» может иметь хоть какой-то размер?

Спроси у авторов gcc. Cколько помню всегда 1 было.

Может у него и значения есть?

Вопрос же не в том, что есть и чего нет, а как это интерпретировать.
Например:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
Здесь есть такая интересная штука void *(*start_routine) (void *).
Как ты думаешь, на что указывает (void *) в аргументе?

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

Как ты думаешь, на что указывает (void *) в аргументе?

И на что же?

Спроси у авторов gcc. Cколько помню всегда 1 было.

Это преданья старины глубокой, когда в Си не было void, а был только char. Когда имплементировали void, притащили этот sizeof.

Голову-то немного надо включать: есть формальная семантика, а есть костыли.

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

Как ты думаешь, на что указывает (void *) в аргументе

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

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

Как ты думаешь, на что указывает (void *) в аргументе?

На то же, на что и arg.

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

6.7.6.2 Array declarators

Constraints

1 In addition to optional type qualifiers and the keyword static, the [ and ] may delimit an expression or *. If they delimit an expression (which specifies the size of an array), the expression shall have an integer type. If the expression is a constant expression, it shall have a value greater than zero.

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

Ну не сказал бы:

warning: zero size arrays are an extension [-Wzero-length-array]
    printf("%li\n", sizeof(int[0]));
RazrFalcon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.