Ваша проблема «Я предполагаю, что» структура Defintion
typedef struct test {
int a;
};
Это не просто определение структуры, а определение типа и он отсутствует имя типа, это может быть исправлено, как это
typedef struct test {
int a;
} MyTestStruct;
или просто удалить typedef
и просто использовать struct test
объявить его экземпляры.
Кроме того, если вы намерены получить доступ к своим членам, вы должны предоставить определение в том же компиляционном блоке, где вы обращаетесь к его членам, в этом случае в файле «main», как вы его назвали.
Если вы хотите, чтобы скрыть элементы (сделать его непрозрачную структуру), попробуйте как этого
struct.h
#ifndef __STRUCT_H__
#define __STRUCT_H__
struct test; // Forward declaration
struct test *struct_test_new();
int struct_test_get_a(const struct test *const test);
void struct_test_set_a(struct test *test, int value);
void struct_test_destroy(struct test *test);
#endif /* __STRUCT_H__ */
И вы бы тогда
struct.c
#include "struct.h"
// Define the structure now
struct test {
int a;
};
struct test *
struct_test_new()
{
struct test *test;
test = malloc(sizeof(*test));
if (test == NULL)
return NULL;
test->a = DEFAULT_A_VALUE;
return test;
}
int
struct_test_get_a(const struct test *const test)
{
return test->a;
}
void
struct_test_set_a(struct test *test, int value)
{
test->a = value;
}
void
struct_test_destroy(struct test *test)
{
if (test == NULL)
return;
// Free all freeable members of `test'
free(test);
}
Этот метод на самом деле очень изящный и имеет много преимуществ, самое важное из того, что вы можете быть уверены, что структура используется правильно, так как никто не может устанавливать значения напрямую, и, следовательно, никто не может устанавливать недопустимые/неправильные значения. А также, если некоторые из его членов распределяются динамически с использованием malloc()
, вы можете гарантировать, что они будут освобождены, когда пользователь называет _destroy()
указателем. Вы можете контролировать диапазон значений, которые считаете подходящими, и избегать переполнения буфера в тех случаях, когда он применяется.
Просьба уточнить проблему. – Petr
Сначала прочитайте страницу [Ask]. –
@Petr, нет .cpp-файла. Посмотрите на код, это [tag: c]. –