我正在与C群中的一群朋友在C中创建一个简单的2D游戏引擎。我想以面向对象的方式编写这个引擎,使用structs
作为类,函数指针作为方法等。为了模拟标准OOP语法,我创建了一个create()
函数,它在对象的内存。我正在测试它,我收到一个错误。这是我用于测试的两个文件的代码:
test.c的:
#include <stdio.h>
int main()
{
typedef struct
{
int i;
} Class;
Class *test = (Class*) create(Class);
test->i = 1;
printf("The value of \"test\" is: %i\n", test->i);
return 0;
}
utils.c:
#include <stdio.h>
#include <stdlib.h>
#include "utils.h"
void* create(const void* class)
{
void *obj = (void*) malloc(sizeof(class));
if (obj == 0)
{
printf("Error allocating memory.\n");
return (int*) -1;
}
else {
return obj;
}
}
void destroy(void* object)
{
free(object);
}
utils.h
文件只保存create()
和destroy()
函数的原型。
当我执行gcc test.c utils.c -o test
时,我收到此错误消息:
test.c: In function 'main':
test.c:10:32: error: expected expression before 'Class'
我知道它在开始时与我的typedef
有关,以及我可能没有使用正确的语法。但我不知道正确的语法是什么。有人可以帮忙吗?
答案 0 :(得分:1)
你的代码在这方面毫无意义
Class *test = (Class*) create(Class);
Class
是类型名称。你为什么要把它作为create
的参数传递给你?您不能将类型名称用作C中的函数参数。
你的create
函数似乎期望某种指针作为参数。该指针的目的对我来说完全不清楚,但这里的底线是类型名称Class
不能在这里用作参数。
在create
内,您使用sizeof(class)
作为要分配的内存量。这个sizeof(class)
只会评估指针大小,这绝对不是你需要的。
基本上,你需要重新思考你想要做的事情并从头开始。我建议先在C上阅读这本书。你现在拥有的只是......随意。
答案 1 :(得分:0)
这一行:
Class *test = (Class*) create(Class);
不应该是
Class *test = (Class*) create(sizeof(Class));
代替?
请注意class
是反向C ++关键字:
void* create(const void* class)
修改强> 你应该是:
void* create(unsigned sz)
{
void *obj = (void*) malloc(sz);
if (obj == 0)
{
printf("Error allocating memory.\n");
}
return obj;
}
void destroy(void* obj)
{
free(obj);
}
用法:
Class *test = (Class*) create(sizeof(Class));