Зачем вызывать функцию, которая не принимает никаких параметров с параметром, компилируемым в C, но не в С++

Предположим, что у меня есть эта функция:

void func() {}

Когда я вызываю func с некоторыми параметрами (например, func(132)), компилятор C++ выдает ошибку, а компилятор C - нет.

В чем разница между двумя компиляторами в этом случае? И какие преимущества/недостатки имеет C++, вызвав эту ошибку?

Ответы

Ответ 1

Нет никаких преимуществ или недостатков. C поддерживает это для совместимости с K & R C с 1980-х годов. Вам может понравиться эта функция, если вы все еще используете код, написанный в 1980-х годах. Вам может не понравиться эта функция, если вы хотите получить лучшую диагностику от своего компилятора.

void func();

В C это означает, что func принимает неуказанные параметры.

Если вам нужно указать, что функция не принимает никаких параметров, напишите ее следующим образом:

void func(void);

В С++ два прототипа одинаковы. (В C только второй - прототип.) Если вы скомпилируете с помощью параметра GCC/Clang -Wstrict-prototypes, вы получите предупреждения для использования void func(); в C, как и должно быть.

Речь идет только о объявлениях .. В обоих языках следующие функции определения совпадают:

// These two are the SAME
void func() { }
void func(void) { }

// These two are DIFFERENT
void func();
void func(void);

Ответ 2

В С++ эта функция не имеет аргументов. В C это означает неопределенное количество аргументов.

Это задержка с самых ранних дней C, где каждая функция возвратила int, и она была намного более расслабленной относительно переданных аргументов.