Это код, скомпилированный с GCC (с -std = c99) и G ++ (с -std = c ++ 98):
void fun()
{}
int main()
{
fun(1,2,3);
return 0;
}
GCC успешно скомпилировал код, но G ++ придумал следующее:
error: too many arguments to function ‘int fun()’
Я полностью сбит с толку.
Я знал, что C ++ должен быть совместим с C по замыслу, но этот случай показывает мне несовместимость. Этот случай происходит по замыслу?
В C пустой список параметров означает, что вы не указываете, сколько аргументов принимает функция. Чтобы определить функцию с 0 параметрами, вы должны использовать (void)
как список параметров. В C ++ пустой список параметров означает, что функция принимает 0 параметров, поэтому да, C и C ++ не совместимы в этом случае.
Я знал, что C ++ должен быть совместим с C по замыслу, но этот случай показывает мне несовместимость. Этот случай происходит по замыслу?
Хотя C ++ совместим с C во многих случаях, это не всегда так. Другими примерами являются неявные приведения void*
(разрешено в C, но не в C ++) и ключевые слова (вполне допустимо использовать что-то вроде class
как имя переменной в C, но, очевидно, не в C ++, где это ключевое слово). И да, это по замыслу.
В с ++
void fun();
означает функцию, не имеющую аргументов.
Чтобы сообщить это на C напишите
void fun(void); // also works in c++ but it's frowned upon