Home > Software engineering >  Does C have a version of JavaScript "this"?
Does C have a version of JavaScript "this"?

Time:12-18

I've use quite a bit of JavaScript so far. If you were to use an object constructor in JavaScript, you have access to the this constructor.

So my question relates to trying to use a similar concept in C. I created a struct that I want to be able to self reference:

struct Storage {
    void (*delete)();
}

So if I were to allocate a Storage class:

struct Storage *myStruct = malloc(sizeof(struct Storage));

Let's say I'm trying to delete myStruct. If I have some delete function that I point to (with myStruct->delete = deleteStructure), I would like to do something like this:

myStruct.delete();

which would then free() the struct through a self referencing variable inside of said delete function. I'm wondering if there would be a way to have the delete function look like:

void deleteStructure() {
    free( /* "this" or some equivalent C self-reference */ );
}

My assumption from research so far is that this is not possible since this is usually only in object oriented programming languages. If this is not possible, I'm wondering what would be the semantically correct way to do this. I'm hoping to make the usage of this delete functionality rather simplistic from a user interface perspective. The only way I understand this to work would be passing a reference to the structure like:

void deleteStructure(struct Storage *someStructure) {
    free(someStructure);
}

which would then require deletion to be done as follows:

deleteStructure(myStruct);

To sum up: is there a way to make a delete function that uses self references in C, and if not, what would be the most semantically correct way to delete a structure in the most user friendly way?

CodePudding user response:

No. You cannot even define a function for a struct.

struct Storage {
    void (*delete)();
}

simply stores a pointer to a void function. That could be any void function and when it is being called, it has no connection to Storage whatsoever.

Also note that in your code, every instance of the struct stores one pointer to a void function. You could initialize them so that they all point to the same function, in which case you would simply waste 64 bit per instance without any real benefit. You could also make them point to completely different functions with different semantics.

CodePudding user response:

As per @UnholySheep's comment, the correct semantical use of a struct with connection to a C function will follow the structure:

struct Storage {
    /* Some definitions here */
}

void deleteStructure(struct Storage *someStructure) {
    free( /* all inner structure allocations */ );

    free(someStructure);
}

Here's more about passing structs by reference.

  • Related