2012-03-01 2 views
0

Я довольно новыми для C, я изучаю чужой код, и я нашел эту функцию:Синтаксис функции в C

static 
    cp_file(output, input, record, ft) 
    dy_char *output;  /* output file */ 
    dy_char *input;  /* input file */ 
    dy_char *record;  /* record id */ 
    int  ft;   /* file type */ 
    { 

делать ли это точно то же самое, как говорят это:

static cp_file(dy_char *output, dy_char *input, dy_char *record, int ft) { 

Является ли более эффективным, чем другой, или это совсем другой стиль синтаксиса? Если они разные, каковы различия?

+1

Это обман. –

+4

Поскольку это действительно старый стиль, вы, вероятно, смотрите на действительно старый код. Это может быть не хорошая модель для подражания, если вы пытаетесь научиться C. – zmccord

+1

Хорошая точка, спасибо zmccord –

ответ

4

Нет, они не идентичны.

Первая форма - это определение функции старого стиля, а вторая - прототип формы определения функции.

Они отличаются по отношению к передаваемому аргументу. Функции с прототипом преобразуют аргументы, как если бы по назначению в то время как не-прототипные функции, как в вашем первом примере, выполняют продвижение аргументов по умолчанию.

Аргументы преобразования для старой формы:

(С99, 6.5.2.2p6) «Если выражение, которое обозначает вызываемой функции имеет тип, который не включает в себя прототип, целые акции выполняются на каждый аргумент и аргументы, имеющие тип float, повышаются до double. Они называются рекламными акциями по умолчанию. "

Аргументы преобразования для формы прототипа:

(C99, 6.5.2.2p7) «Если выражение, которое обозначает вызываемой функции имеет тип, который действительно включает прототип, аргументы неявно преобразуются , как бы присваиванием, типам соответствующих параметров, считая тип каждого параметра неквалифицированной версией его объявленного типа ».

Обратите внимание, что старая форма (не прототип) устарела и сильно обескуражена.

(C99, 6.11.7p1 Будущих языки направления) «Использование определений функций с отдельными идентификаторами параметров и деклараций списков (не прототип форматом типа параметра и declarators идентификатора) является устаревшее функцией.»

+1

+1. Прошло двадцать лет с тех пор, как я встретил такой прототип в живом коде и полностью забыл этот момент. –

+0

Очень хорошо объяснено, спасибо –

2

Оба идентичен, однако,
последнего стандарт совместимый синтаксис, в то время как первое является неясным K&R syntax.

Всегда, используя стандартный код при написании любого нового кода, старые базовые коды кода могут использовать синтаксис K & R, поскольку в то время он был широко используемым синтаксисом.

+0

неясный K & R? - только вам whippersnappers :) – KevinDTimm

2

Да, оба утверждения в основном идентичны, за исключением случаев, отмеченных ouah. Это «оригинальный» синтаксис пред-ANSI для объявления функций. В начале 1990-х годов это стало непригодным.

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