Существует различие в определении термина определение между C и C ++. Эта разница не очень хорошо известна (я узнал об этом только при исследовании этого вопроса), и большинство людей и книг используют определение C также в контексте C ++.
В Си объявление также является определением, если оно имеет <выбрать из набора> дополнительных свойств.
В C ++ объявление является всегда определением, если оно не является одним из <выбирать из набора>.> Br />
Для большинства практических целей это различие между определениями определение не имеет никакого значения, пока вы не начнете рассматривать угловые случаи.
В Си структура-член и параметр в прототипе функции являются , а не определениями, поскольку они не обладают обязательным свойством резервирования памяти для объявленного объекта.
В C ++ переменная-член struct (или class) и параметр в прототипе являются определениями , поскольку они не попадают в список исключений.
Я думаю, что это различие не является необходимым и прискорбным, потому что оно делает более трудным, чем необходимо, понимание разницы между декларацией и определением.
Q1. Определяется ли параметр 'duration' или он объявлен?
Согласно буквальному прочтению стандарта C ++, он определяется. Но я надеюсь, что это является дефектом в стандарте, потому что объявленный имеет больше смысла для меня.
int switchon(float duration, int duration); // idea is to see what error
// compiler gives
int main() { }
error C2371: 'duration' : redefinition; different basic types
Скорее всего, вы получите ту же ошибку для:
extern float duration;
extern int duration;
Это оба объявления, но диагностика компилятора может не отражать это.