Почему аргумент может быть вне () в определении функции? - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть фрагмент кода в моем файле .y, как показано ниже

void yyerror(s) char *s; {
  fputs(s, stderr);
  putc('\n', stderr);
}

Объявление прототипа функции находится в другом файле следующим образом

void yyerror (char const *s);

Я попытался скомпилировать кодна Linux и Mac.В Linux компилятор генерирует следующее сообщение об ошибке

error: argument ‘s’ doesn’t match prototype
 void yyerror(s) char *s; {
                       ^

В Mac компилятор генерирует следующее предупреждающее сообщение

warning: promoted type 'char *' of K&R function parameter is not compatible with the parameter type 'const char *' declared in a previous prototype [-Wknr-promoted-parameter]
void yyerror(s) char *s; {
                      ^

Мои вопросы:

  1. Почему clang генерирует предупреждение только тогда, когда cc генерирует ошибку.
  2. Оба компилятора жалуются на 's' в "char * s".Почему они игнорируют 's' в (), но рассматривают второе 's' как аргумент?
...