Можем ли мы определить функции в структурах на языке программирования C?
Определение функций в структурах
Ответ 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();
}