Я чув, що є гарною практикою писати функції, які не отримують нічого в якості такого параметра:
int func(void);
Але я чую, що правильний спосіб виразити це так:
int func();
Яка різниця між цими двома деклараціями функцій як у C, так і в C ++?
Я чув, що є гарною практикою писати функції, які не отримують нічого в якості такого параметра:
int func(void);
Але я чую, що правильний спосіб виразити це так:
int func();
Яка різниця між цими двома деклараціями функцій як у C, так і в C ++?
Відповіді:
C і C ++ в цьому відношенні різні.
6.7.6.3 Декларатори функцій (включаючи прототипи)
...
10 Особливий випадок неназваного параметра типуvoidяк єдиного елемента у списку визначає, що функція не має параметрів.
...
14 Список ідентифікаторів оголошує лише ідентифікатори параметрів функції. Порожній список декларатора функції, який є частиною визначення цієї функції, вказує, що функція не має параметрів. Порожній список у деклараторі функцій, який не є частиною визначення цієї функції, вказує, що інформація про число чи типи параметрів не надається. 145)
Коротше кажучи, порожній список параметрів в функції декларації вказує , що функція приймає невизначений кількість параметрів, в той час як порожній список параметрів в функції визначення вказує , що функція не приймає ні одного параметра.
T foo( void ); // declaration, foo takes no parameters
T bar(); // declaration, bar takes an *unspecified* number of parameters
T foo( void ) { ... } // definition, foo takes no parameters
T bar() { ... } // definition, bar takes no parameters
Що стосується C, ви ніколи не повинні використовувати порожній список ідентифікаторів у оголошенні функції чи визначенні. Якщо функція не призначена для прийому будь-яких параметрів, вкажіть це за допомогою voidсписку параметрів.
8.3.5 Функції [dcl.fct]
...
4 Параметр-декларація-параметр визначає аргументи, які можна вказати, та їх обробку, коли функція викликається. [ Примітка: пункт -декларація-параметр використовується для перетворення аргументів, зазначених у виклику функції; див. 5.2.2. - кінцева примітка ] Якщо параметр-декларація-параметр порожній, функція не бере аргументів. Список параметрів, що складається з одного безіменного параметра незалежного типуvoid, еквівалентний порожньому списку параметрів. За винятком цього особливого випадку, параметр не повинен мати типcv void. Якщо параметр-декларація-пунктзакінчується еліпсісом або пакетом функціональних параметрів (14.5.3), кількість аргументів має бути рівним або більше, ніж кількість параметрів, які не мають аргументу за замовчуванням і не є пакетами параметрів функції. Там, де синтаксично правильно і де "..." не входить до конспекту-декларатора , ", ..." є синонімом "...". [ Приклад: деклараціяоголошує функцію, яку можна викликати з різними числами та типами аргументів.int printf(const char*, ...);Тим НЕ менше, перший аргумент повинен бути такого типу , який може бути перетворений вprintf("hello world"); printf("a=%d b=%d", a, b);const char*- кінець прикладу ] [ Примітка: Стандартний заголовок<cstdarg>містить механізм для доступу аргументів , переданих з допомогою крапки (див 5.2.2 і 18.10). - кінцева примітка ]
У випадку C ++ порожній список параметрів або в декларації, або у визначенні вказує на те, що функція не бере аргументів і еквівалентна використанню списку параметрів void.
У C функція з порожнім списком параметрів ()може приймати що- небудь для своїх аргументів. Буквально нічого. Зазвичай він використовується для реалізації функції, яка може приймати змінну кількість аргументів , хоча в наші дні вважається кращим використовувати (...)для цих функцій більш явний синтаксис еліпсису .
У C функція зі списком параметрів (void)явно не бере нічого за свої аргументи. Це означає, що компілятор може насправді сказати, що ви помилилися, якщо спробуєте щось передати.
У C ++ ці декларації функції еквівалентні. Порожній список параметрів означає "немає параметрів" так само, як voidі.
()для варіантів. Чи є у вас приклад програми, яка використовує цю конвенцію?
...синтаксисом, і вона повинна мати принаймні один названий параметр. Визначення такої функції ()викликає невизначену поведінку - і тіло функції не може використовувати макроси, визначені в <stdarg.h>для читання значень параметрів. Це стосується стандарту 1989/1990 років.
...синтаксису, щоб уникнути невизначеної поведінки.