Ошибки при попытке передать структуру функции

В следующей программе я пытаюсь передать структуру функции. Но я получаю ошибки, и я не понимаю, почему. Какую ошибку я совершил в этой программе?

Я использую gcc для компиляции этой программы c.

#include <stdio.h>

struct tester {
  int x;
  int *ptr;
};

void function(tester t);

int main() {
 tester t;
 t.x = 10;
 t.ptr = & t.x;
 function(t);
}

void function(tester t) {
   printf("%d\n%p\n",t.x,t.ptr);
}

Ошибки:

gcc tester.c -o tester

tester.c:8:15: error: unknown type name ‘tester’
tester.c: In function ‘main’:
tester.c:12:2: error: unknown type name ‘tester’
tester.c:13:3: error: request for member ‘x’ in something not a structure or union
tester.c:14:3: error: request for member ‘ptr’ in something not a structure or union
tester.c:14:13: error: request for member ‘x’ in something not a structure or union
tester.c: At top level:
tester.c:18:15: error: unknown type name ‘tester’

ПРИМЕЧАНИЕ: Если я заменил printf на cout и stdio на iostream и назовет расширение до .cpp (!), я не получаю ошибок. Почему это? Неудивительно, что я скомпилирую его с помощью g++

Ответ 1

Если вы не набираете структуру, вы должны указать struct перед именем структуры, объявив ее так:

struct tester t;

Либо вы это сделаете, либо выполните следующие действия:

typedef struct {
  int x;
  int *ptr;
}tester;

Обновить

Ниже приведена цитата из Адама Розенфилда из следующего сообщения Разница между 'struct' и 'typedef struct' в С++?:

В С++ все объявления struct/union/enum/class действуют так, как будто они неявно typedef'ed, если имя не скрыто другим объявлением с тем же именем.

Ответ 2

ваша структура не называется. либо используйте struct tester t; или usa a typedef

Ответ 3

Дело в том, что вы пытаетесь скомпилировать с помощью gcc, который является компилятором "c language", и вы следуете стилю кода на С++.
Создать структурную переменную можно только с помощью structname variablename;
но в С++ вы явно должны сказать компилятору, что это структура, как, например, struct structname variablename; Просто сделайте это, и с вами все будет в порядке, иначе вы можете использовать typedef, который в основном вы сообщаете теперь в форме компилятора, и вы будете называть struct tester только тестером, который подойдет вам больше, поскольку вам нужно будет только незначительное изменение.