2016-02-01 2 views
-4

Я хотел сделать объектно-ориентированный препроцессор для моего языка программирования, который преобразует мой язык в C (например, ранний C++). И я хочу имитировать классы со структурами. И возникает вопрос: как я могу объявить переменную внутри структуры, как это:Объявление переменных внутри структуры в c

typedef struct { //equivalent of class 
    int a = 5; 
    int (*sub)(int) = &int_sub; //function of a class, uses an external declared function 
} class_name; 

Я попытался код, приведенный выше, но компилятор писал:

error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token 
     void (*sub)(int) = &int_sub; 

У меня есть два вопроса:

  1. Могу ли я объявить переменную внутри структуры?

  2. Если да, то как?

+1

Вы изобретают свой собственный язык программирования, но не знаю, как объявить-структуру ? Хм ... :) – Lundin

+0

В любом случае, первый вопрос, который вы должны задать здесь: как это имеет смысл для вашего класса использовать внутренне определенную функцию внутри? Это какой-то функтор? – Lundin

ответ

4

В качестве альтернативы, вы можете также инициализировать переменную вашего типа структуры.

int func(int a){} 

typedef struct { 
    int a; 
    int (*sub)(int); 
} class_name; 

class_name my_struct = { .a = 5, .sub = func }; 
8

Вы не можете назначить значение указателя внутри определения структуры. Вы можете использовать функцию для ее инициализации.

typedef struct { //equivalent of class 
    int a; 
    int (*sub)(int); 
} class_name; 

int int_sub (int a) 
{ 
    // your stuff 
    return 0; 
} 

int main() 
{ 
    class_name myClassVariable; 

    myClassVariable.a = 5; 
    myClassVariable.sub = int_sub; 

    printf("class_name.a = %d\n", myClassVariable.a); 
    printf("class_name.sub = %p\n", myClassVariable.sub); 
    printf("int_sub address = %p\n", int_sub); 

    return 0; 
} 

Или, как показано в ARTM ответ, вы можете инициализировать Ваш выделенную переменную:

class_name my_struct = { .a = 5, .sub = int_sub }; 
+0

Это неправда. Вы также можете использовать простой инициализатор для инициализации структуры. Никакой функции не требуется. – fuz

+0

@FUZxxl Вы правы. Я собираюсь отредактировать. – LPs

+0

Желательно, чтобы вы реализовали классы с _opaque type_, поэтому, как вы инициализируете структуру в main, на самом деле не актуально, потому что вы не должны этого делать в первую очередь - это плохой ООП. Вместо этого он должен быть инициализирован внутри конструктора для непрозрачного типа. Например, 'class_name * class_init (int a) {class_name * new_class = malloc (sizeof (* new_class)); new_class-> a = a; new_class-> sub = you_probably_want_a_static_function_here; return new_class; } ' – Lundin

1

Я принимаю это ваш вопрос не о том, как объявить но как инициализировать элементом структуры.

Определить класс как непрозрачный тип в файле h. Используйте typedef для указателей функций.

ч файл

// opaque type declaration 
typedef struct class_name class_name; 

// types used by this class 
typedef int sub_func_t (int); 

// member functions of the class 
class_name* class_init (int a, sub_func_t* sub); 

Затем инициализировать его внутри своего конструктора:

с файл

struct class_name { //equivalent of class 
    int a; 
    sub_func_t* sub; 
}; 

class_name* class_init (int a, sub_func_t* sub) 
{ 
    class_name* new_class = malloc(sizeof(*new_class)); 
    assert(new_class != NULL); 
    *new_class = (class_name){a, sub}; 
    return new_class; 
} 
Смежные вопросы