Безопасна ли вложенная функция в G CC? Определение класса в GNU C - PullRequest
0 голосов
/ 19 июня 2020

Раньше использование вложенной функции в G CC было спорным . Его главный недостаток в том, что он использует технику под названием батут . Теперь, когда вы можете предотвратить это, указав -fno-trampolines при компиляции, можно ли, наконец, безопасно использовать?

Вложенные функции мне очень интересны, так как я могу использовать их для создания структуры который похож на класс, путем определения и назначения функции класса внутри функции-конструктора:

#include <stdio.h>
#include <stdlib.h>

struct classStruct;
typedef struct classStruct ClassA;

struct classStruct {
    int a;
    //class constructor
    ClassA* (*new_Class_A)();
    //class destructor
    void (*free_Class_A)();
    //class function
    int (*geta)();
};

ClassA* new_Class_A(int a) {
    ClassA* temp = NULL;
    temp = (ClassA*) malloc(sizeof(ClassA));
    //assign variables
    temp->a = a;
    //assign constructor
    temp->new_Class_A = new_Class_A;
    //assign destructor
    void free_Class_A() {
        temp->new_Class_A = NULL;
        temp->free_Class_A = NULL;
        temp->geta = NULL;
        temp->a = 0;
        free(temp);
    }
    temp->free_Class_A = free_Class_A;
    //assign class function
    int geta () {
        return temp->a;
    }
    temp->geta = geta;
    return temp;
}

int main (int argc, char* argv[]) {
    //declare a new instance
    ClassA* ANumber = new_Class_A(12);
    //access a class function is now super easy
    printf("%d\n",ANumber->geta());
    //destroy instance
    ANumber->free_Class_A();
    return 0;
}

Затем я могу теперь вызвать функцию класса object-> geta () так же, как и в C ++. of object-> geta (& object), фактически имеющий нечто похожее на неявное ключевое слово this. Это сейчас приемлемо? Могу ли я столкнуться с проблемами при вызове функций вне функции конструктора?

Давайте оставим вопросы вроде «почему?» или «почему вы просто не использовали C ++» сейчас из этого обсуждения: P.

...