Почему не разрешается использовать аргументы по умолчанию для объявления и определения функций?

#c

Вопрос:

так почему же не допускается иметь аргументы по умолчанию для объявления и реализации функции? Разве это не было бы более понятным для разработчика и пользователя функции?

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

С уважением

Комментарии:

1. А если пользователь использует неправильные значения? Или меняет одно, а не другое? Это просто дополнительная работа для компилятора/компоновщика без какой-либо выгоды. Значения по умолчанию используются только на сайте вызова, поэтому достаточно указать их только в объявлении.

2. Потому что только декларация имеет значение. Аргументы по умолчанию сообщают компилятору, какие аргументы следует вставлять на сайтах вызовов. Если при реализации были разрешены аргументы по умолчанию, то теперь возникает проблема, при которой реализация вводит в заблуждение, если она использует значения, отличные от объявления, используемого вызывающим.

3. Технически они, конечно, могли бы это допустить и, например, допустили бы ошибку, если бы она отличалась между объявлением и реализацией. Я не знаю, почему они этого не сделали — наверное, это просто сочли ненужным усложнением.

4. @500-Ошибка внутреннего сервера компилятор не обязательно мог обнаружить ошибку. Декларация может даже не быть включена

5. Аргументы по умолчанию заполняются на сайте вызова вызывающего абонента. Таким образом, сайт вызова должен иметь возможность видеть, каковы аргументы по умолчанию. Вот почему они помещаются в заголовочный файл для объявлений функций. (Это немного хрупко, потому что при изменении значения аргумента по умолчанию все, на что повлияло, должно быть перекомпилировано. Использование функции перегрузки thunk и внутренняя передача значений по умолчанию означает, что зависимые вызывающие устройства не нужно перекомпилировать. Важно только для более крупных проектов.)

Ответ №1:

На самом деле, просто у нас не может быть в одной области 2 объявления с (общим параметром с) аргументом по умолчанию:

 void foo(int = 42);
void foo(int = 42); // Error.
 

и определение действует также как декларация.

если ваше определение не включает заголовок с объявлением, в определении также может быть значение по умолчанию.

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

Хотя я не знаю, почему эти правила.