Что такое sizeof (main), sizeof (printf), sizeof (scanf)? - PullRequest
8 голосов
/ 01 октября 2010

В компиляторе gcc sizeof(main), sizeof(printf) и sizeof(scanf) все равны 1. Я хочу знать, каков их размер 1. Какова логика?

1 Ответ

22 голосов
/ 01 октября 2010

Поскольку стандарт C (99) требует (& sect; 6.5.3.4/1)

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

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

sizeof(&main)
sizeof(&printf)
sizeof(&scanf)

gcc возвращает 1 для типов, которые sizeof не имеет смысла (см. c-common.c ):

4187     if (type_code == FUNCTION_TYPE)
4188       {
4189         if (is_sizeof)
4190           {
4191             if (complain && (pedantic || warn_pointer_arith))
4192               pedwarn (loc, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
4193                        "invalid application of %<sizeof%> to a function type");
4194             else if (!complain)
4195               return error_mark_node;
4196             value = size_one_node;
4197           }
4198         else
4199           value = size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT);
4200       }
4201     else if (type_code == VOID_TYPE || type_code == ERROR_MARK)
4202       {
4203         if (type_code == VOID_TYPE
4204             && complain && (pedantic || warn_pointer_arith))
4205           pedwarn (loc, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
4206                    "invalid application of %qs to a void type", op_name);
4207         else if (!complain)
4208           return error_mark_node;
4209         value = size_one_node;
4210       } 
...