что возвращает sizeof (имя функции)? - PullRequest
25 голосов
/ 19 апреля 2010

пример кода:

main ()
{
printf ("size = %d\n", sizeof (main));
}

Ответы [ 4 ]

14 голосов
/ 19 апреля 2010

C стандарт запрещает это - при компиляции с gcc -pedantic выдает invalid application of ‘sizeof’ to a function type предупреждение.

Однако gcc компилирует его и возвращает 1 для sizeof(main), и это не размер указателя функции.

Кажется, это зависит от компилятора.

6 голосов
/ 16 февраля 2013

Размер оператора

 sizeof unary-expression
 sizeof ( type-name )

Операндом является либо идентификатор, который является унарным выражением, либо выражение приведения типа (то есть спецификатор типа, заключенный в скобки). Унарное выражение не может представлять объект битового поля, неполный тип или function designator. Результатом является беззнаковая интегральная константа. Стандартный заголовок STDDEF.H определяет этот тип как size_t.

Используйте флаг компиляции -Wall -pedantic, чтобы выдать предупреждение о неправильном операнде на sizeof (помните, sizeof - оператор времени компиляции), Код:

$ cat sizeof.c 
#include<stdio.h> 
int main(){
    printf("%zu %p\n", sizeof(main), (void*)main);
    return 0;
} 

Сообщение компиляции с GCC версии 4.6.3 (Ubuntu / Linaro 4.6.3-1ubuntu5):

$ gcc -Wall -pedantic sizeof.c -std=c99
sizeof.c: In function ‘main’:
sizeof.c:3:30: warning: invalid application of ‘sizeof’ to a function type 
              [-pedantic]
sizeof.c:3:38: warning: ISO C forbids conversion of function pointer to 
              object pointer type [-pedantic]

Читайте также:

6.5.3.4 Размер оператора

1118 & mdash; Оператор sizeof должен не применяться к выражению, имеющему тип функции или неполный тип, к названию в скобках такого типа или к выражению, которое обозначает элемент битового поля
1127 - Значение результата определяется реализацией, а его тип (целочисленный тип без знака) равен size_t, определен в <stddef.h> (и других заголовках)

Кроме того, правильная строка формата для size_t равна %zu, и если ее нет, например, компилятор Microsoft, вы можете использовать %lu и преобразовать возвращаемое значение в unsigned long.

5 голосов
/ 19 апреля 2010

ISO C ++ запрещает применение sizeof к выражению типа функции.

ИСО / МЭК 14882 на C ++ гласит (раздел 5.3.3):

"Оператор размера не должен применяться к выражению, которое имеет функцию или неполный тип, ..."

То же самое относится к стандарту C (ISO / IEC 9899: 1999), раздел 6.5.3.4:

.

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

1 голос
/ 18 августа 2015

Согласно ISO C11, раздел 6.5.3.4 The sizeof and _Alignof operators, подраздел 1 (ограничения):

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

В разделе 6.3.2.1 Lvalues, arrays, and function designators также есть подраздел 4, в котором говорится:

Обозначение функции - это выражение с типом функции. За исключением случаев, когда это операнд оператора sizeof, оператора _Alignof (65) или унарного оператора &, указатель функции с функцией типа «return» тип "преобразуется в выражение с типом" указатель на функцию, возвращающую типа "".

Примечание к футу 65, на которое есть ссылка, уточняет:

Поскольку это преобразование не происходит, операнд оператора sizeof или _Alignof остается обозначением функции и нарушает ограничения в 6.5.3.4.

Согласно сечению 4 Conformance:

В настоящем международном стандарте «должен» должен интерпретироваться как требование к реализации или программе; и наоборот, «не должен» должен интерпретироваться как запрет .

Следовательно, строго соответствующая программа никогда не должна принимать размер функции. Но, опять же, вероятно, он также должен использовать правильную форму main(): -)

Однако здесь есть лазейка. Соответствующей реализации разрешено предоставлять расширения "при условии, что они не изменяют поведение каких-либо строго соответствующая программа "(раздел 4 Conformance, подраздел 6).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...