2015-06-26 2 views

ответ

3

Это прототип функции, объявляющий функцию getint(). Функция принимает в качестве параметра указатель на int.

При прототипировании функции нет необходимости указывать имена параметров.

В прототипе отсутствует тип возврата, который по умолчанию по умолчанию int. Однако отказ от типа возврата нарушает недавний стандарт C, поэтому код, сделанный таким образом, может считаться недействительным.

Эквивалент

getint(int *); 

хотя бы

int getint(int * pi); 
+0

Нет никакой разницы между этими двумя инструкциями? – user3826752

+3

Обратите внимание, что неявное правило int было удалено с C99. Так что это не действительный прототип. –

+0

@BlueMoon Даже при использовании GCC в режиме C89 вы получаете предупреждение, когда отсутствует тип возврата. –

2

TL; DRgetint (int *); является опережающим объявлением для функции, в стиле программирования очень плохо. Без какого-либо явного типа возврата он будет по умолчанию равен int.

Рекомендуемый способ написать это, чтобы указать тип возвращаемого значения в явном виде, как

  • если int, как

    int getint(int *); //yes, omitting the identifier name is correct, see note below 
    

    или

    int getint(int * outVar); //we can have the name, if we want. 
    
  • если void, подобный

    void getint(int *); 
    

    или

    void getint(int * outVar);  
    

или любой тип возврата вы хотите.


Примечание:

Просто для дальнейшего использования, от C11, глава §6.7.6.3, Функция declarators, (курсив мой)

Если в объявлении 'T D1', D1 имеет вид

D(parameter-type-list) 

...

Список типов параметров определяет типы и может объявлять идентификаторы для параметров функции.

Таким образом, имя идентификатора не является обязательным.

+0

Или еще лучше, используя также описательный формальный параметр: 'int getint (int * result)'. –

+0

@AugustKarlstrom _maybe_ лучше, но не ** требуется **, однако обновил мой ответ. :-) –

+0

"* if' int' ... * ":' getint() 'в соответствии с OP ** ** возвращает' int' (или считается недопустимым из-за отсутствия возвращаемого типа). – alk

1

Код не действителен C. Если он компилируется, рассмотрите возможность обновления до компилятора, который не старше 15 лет.

Урок истории:

В старых, вышедших из употребления версий стандарта C вы разрешили опустить тип возвращаемого при написании функции декларации, в этом случае getint(int *); будет означать то же самое, как int getint(int *);, потому что если вы указали тип возврата не будет по умолчанию int. Тем не менее, это была плохая практика еще в 1990 году.

Смежные вопросы