-1

我正在和一群学校的朋友一起用 C 语言创建一个简单的 2D 游戏引擎。我想以面向对象的方式编写这个引擎,使用structs类、函数指针作为方法等。为了模拟标准的 OOP 语法,我创建了一个create()函数,它为对象分配内存空间。我正在测试它,我收到一个错误。这是我用来测试的两个文件的代码:

测试.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;
}

实用程序.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的一开始有关,以及我可能没有使用正确的语法。但我不知道正确的语法是什么。任何人都可以帮忙吗?

4

2 回答 2

1

您的代码在这方面毫无意义

Class *test = (Class*) create(Class);

Class是一个类型名称。你为什么试图将它作为参数传递给create?您不能在 C 中使用类型名称作为函数参数。

您的create函数似乎期望某种指针作为参数。我完全不清楚该指针的用途,但这里的底线是类型名称Class不能用作此处的参数。

在您的内部,您createsizeof(class)其用作要分配的内存量。这sizeof(class)将简单地评估为指针大小,这绝对不是您需要的。

基本上,您需要重新考虑您正在尝试做的事情并从头开始做。我建议先阅读有关 C 的书。你现在拥有的只是……随机的。

于 2012-10-22T20:57:40.403 回答
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));
于 2012-10-22T20:56:45.483 回答