我想要控制类,结构或新文件。但是当我创造它时。我无法运行我的程序。这是我的计划:
main
档案:
#include <stdio.h>
#include <stdlib.h>
#include "testing.h"
int main(int argc, char** argv) {
struct test var;
var.a = 2;
return (EXIT_SUCCESS);
}
文件头结构:
#ifndef TESTING_H
#define TESTING_H
struct test x;
#endif /* TESTING_H *
最后是文件define struct:
typedef struct test {
int a;
};
我在创建新文件方面没有太多经验。可能是我的问题是愚蠢的。希望大家帮助我。谢谢!
答案 0 :(得分:1)
你的问题&#34; 我在猜测&#34;是结构定义
typedef struct test {
int a;
};
这不仅仅是一个结构定义,而是一个类型定义,它缺少类型名称,它可以像这样修复
typedef struct test {
int a;
} MyTestStruct;
或只是移除typedef
,只需使用struct test
来声明其实例。
此外,如果您打算访问它的成员,那么您必须在同一个编译单元中提供一个定义,您可以在其中访问它的成员,在本例中为&#34; main &#34;你调用它的文件。
如果您想隐藏成员(使其成为不透明的结构),请尝试这样
<强> 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()
时释放它们。您可以控制您认为合适的值范围,并在适用的情况下避免缓冲区溢出。