LINUX.ORG.RU

История изменений

Исправление hateyoufeel, (текущая версия) :

А ты точно C знаешь?

typedef int (*fptr)();

int f1(void) { return 1; }
int f2(int a) { return 2 + a; }

int main(void) {
  fptr f;
  int r = 0;
  f = f1;
  r += f();
  f = f2;
  r += f(1);

  return r;
}

Вот этот код больше не соберётся. Типа несовместимы.

$ gcc void-arg.c -o void-arg -std=c23                                        
void-arg.c: In function ‘main’:
void-arg.c:11:5: error: assignment to ‘fptr’ {aka ‘int (*)(void)’} from incompatible pointer type ‘int (*)(int)’ [-Wincompatible-pointer-types]
   11 |   f = f2;
      |     ^
void-arg.c:12:8: error: too many arguments to function ‘f’
   12 |   r += f(1);
      |   

В общем, из сишечки удалили возможность делать указатель на функцию с неопределёнными аргументами.

Исходная версия hateyoufeel, :

А ты точно C знаешь?

typedef int (*fptr)();

int f1(void) { return 1; }
int f2(int a) { return 2 + a; }

int main(void) {
  fptr f;
  int r = 0;
  f = f1;
  r += f();
  f = f2;
  r += f(1);

  return r;
}

Вот этот код больше не соберётся. Типа несовместимы.

$ gcc void-arg.c -o void-arg -std=c23                                        
void-arg.c: In function ‘main’:
void-arg.c:11:5: error: assignment to ‘fptr’ {aka ‘int (*)(void)’} from incompatible pointer type ‘int (*)(int)’ [-Wincompatible-pointer-types]
   11 |   f = f2;
      |     ^
void-arg.c:12:8: error: too many arguments to function ‘f’
   12 |   r += f(1);
      |