Подтвердить что ты не робот

Определение функций в структурах

Можем ли мы определить функции в структурах на языке программирования C?

4b9b3361

Ответ 1

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

struct foo {
    int a;
    void (*workwithit)(struct foo *);
}

Ответ 2

Вы не можете действительно объявлять материал внутри структуры в C. Это не С++ или любой другой язык OO, где объект инкапсулирует какую-то область видимости.

C-структуры - очень простые объекты, это просто синтаксический сахар для управления куском памяти. Когда вы создаете новый экземпляр struct, struct A a;, компилятор просто резервирует пространство стека в соответствии с его размером, а когда вы выполняете a.member, компилятор знает это смещение члена, поэтому он переходит на &a + смещение этого члена, Эти смещения обычно представляют собой не просто суммы размеров предыдущих членов, потому что компилятор обычно добавляет в структуру некоторые биты заполнения, чтобы лучше вставить его в память.

Надеюсь, это немного помогло. Вы, очевидно, ожидаете слишком много от C-структур: -)

Ответ 3

Нет, вы не можете иметь функции внутри struct в программе на C. Я написал один код и сохранил его как .c и .cpp. Файл .cpp соответствует и работает как ожидалось, но файл .c даже не компилируется.

Вот код для вашей справки. Сохраните его один раз как .cpp, а затем запустите его. Затем сохраните тот же код, что и .c, и скомпилируйте его. Вы получите ошибки компиляции.

#include <stdio.h>
struct C {
    void Test(int value) {
       static int var = 0;
       if (var == value) 
          printf("var == value\n");
       else
          printf("var != value\n");

       var = value;
     }
 }; 

 int main() {
    C c1;
    C c2;
    c1.Test(100);
    c2.Test(100);
    int ii;
    scanf("%d",&ii);
 }

Ответ 4

Нет.

У вас могут быть указатели на функции в структурах, но они находятся как можно ближе.

Ответ 5

Нет, вы не можете. Структуры могут содержать только переменные внутри, сохранение указателей функций внутри структуры может дать желаемый результат.

Ответ 6

Нет. Вы не можете определять функции внутри структур в программах на C. Однако, если расширение вашего файла является .cpp(, а не C), у вас может быть член функции, такие как классы, однако модификатор по умолчанию этих функций будет "общедоступным" (в отличие от класса).

Прочтите эти ссылки для получения дополнительной информации о Структуры хорошая ссылка, другое хорошая ссылка, Еще одна хорошая ссылка

В качестве соглашения в С++ для хранения функций и переменных используются Классы, а Структуры используются только для хранения информации (т.е. данных).

Ответ 7

Нет, но вы можете в С++ struct!

Ответ 8

Вместо этого вы можете в C++:

// Example program
#include <iostream>
#include <string>

struct Node
{
    int data; Node *prev,*next;
    Node(int x, Node* prev=NULL, Node* next=NULL)
    {
        this->data=x; this->prev=prev; this->next=next;
    }
    void print_list()
    {
        Node* temp=this;    //temp is created in function call stack
        while(temp!=NULL)
        {
            std::cout<<temp->data<<" ";
            temp=temp->next;
        }
    }
    Node* insert_left(int x)
    {
        Node* temp=new Node(x,this->prev,this);
        this->prev=temp;
        return temp;                            //list gets new head
    }
    Node* insert_right(int x)
    {
        Node* temp=new Node(x,this,this->next);
        this->next=temp;
        return this;                            //this would still be head
    }

};

int main()
{
    Node* head=new Node(-1);    //-1
    head=head->insert_left(0);  //0 -1
    head=head->insert_right(1); //0 1 -1
    head=head->insert_left(2);  //2 0 1 -1
    head->print_list();
}