Ошибки при попытке передать структуру функции
В следующей программе я пытаюсь передать структуру функции. Но я получаю ошибки, и я не понимаю, почему. Какую ошибку я совершил в этой программе?
Я использую 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 только тестером, который подойдет вам больше, поскольку вам нужно будет только незначительное изменение.