Могут ли структуры содержать функции?
Функции в структуре
Ответ 1
Нет, но они могут содержать указатели на функции.
Если вы намерены делать какую-то форму полиморфизма в C, тогда да, это можно сделать:
typedef struct {
int (*open)(void *self, char *fspec);
int (*close)(void *self);
int (*read)(void *self, void *buff, size_t max_sz, size_t *p_act_sz);
int (*write)(void *self, void *buff, size_t max_sz, size_t *p_act_sz);
// And data goes here.
} tCommClass;
typedef
выше была для структуры, которую я создал для библиотеки общего назначения. Чтобы инициализировать переменную, вы должны:
tCommClass *makeCommTcp (void) {
tCommClass *comm = malloc (sizeof (tCommClass));
if (comm != NULL) {
comm->open = &tcpOpen;
comm->close = &tcpOpen;
comm->read = &tcpOpen;
comm->write = &tcpWrite;
}
return comm;
}
tCommClass *makeCommSna (void) {
tCommClass *comm = malloc (sizeof (tCommClass));
if (comm != NULL) {
comm->open = &snaOpen;
comm->close = &snaOpen;
comm->read = &snaOpen;
comm->write = &snaWrite;
}
return comm;
}
tCommClass *commTcp = makeCommTcp();
tCommClass *commSna = makeCommSna();
Затем, чтобы вызвать функции, что-то вроде:
// Pass commTcp as first params so we have a self/this variable
// for accessing other functions and data area of object.
int stat = (commTcp->open)(commTcp, "bigiron.box.com:5000");
Таким образом, один тип может быть использован для TCP, SNA, RS232 или даже несущих пиджионов с точно таким же интерфейсом.
Ответ 2
edit Устранена двусмысленность с использованием "типов данных"
Не в C. struct
типы могут содержать только данные.
Из раздела 6.7.2.1 стандарта ISO C99.
Структура или объединение не должны содержать элемент с неполным или функциональным типом (следовательно, структура не должна содержать экземпляр самого себя, но может содержать указатель на экземпляр сам по себе), за исключением того, что последний член структуры с более чем одним названным членом может иметь неполный тип массива; такая структура (и любое объединение, содержащее, возможно, рекурсивно, элемент, который является такой структурой) не должен быть членом структуры или элемент массива.
Ответ 3
В C структурам разрешено содержать значения данных, а не указатели на функции. Не допускается в C., но следующие работы буквально прекрасны при проверке с помощью gcc.
enter code here
#include <stdio.h>
struct st_func_ptr{
int data;
int (*callback) ();
};
int cb(){
printf(" Inside the call back \n");
return 0;
}
int main() {
struct st_func_ptr sfp = {10, cb};
printf("return value = %d \n",sfp.callback());
printf(" Inside main\n");
return 0;
}
Итак, я запутался...
Ответ 4
Все в порядке. В коде ядра linux вы обнаружите, что многие структуры содержат функции. такие как:
/*
* The type of device, "struct device" is embedded in. A class
* or bus can contain devices of different types
* like "partitions" and "disks", "mouse" and "event".
* This identifies the device type and carries type-specific
* information, equivalent to the kobj_type of a kobject.
* If "name" is specified, the uevent will contain it in
* the DEVTYPE variable.
*/
struct device_type {
const char *name;
struct attribute_group **groups;
int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
void (*release)(struct device *dev);
int (*suspend)(struct device * dev, pm_message_t state);
int (*resume)(struct device * dev);
};
Ответ 5
Да, его можно объявить функцию, а определение функции не разрешено и должно быть указателем функции.
Его основано на структуре с меткой C99.
Локеш V
Ответ 6
Они могут, но нет никакого присущего преимущества в обычном программировании C.
В C все функции все равно находятся в глобальном пространстве, поэтому вы не скрываете информацию, заправляя их в функцию. Пример paxdiablo - это способ организовать функции в структуре, но вы должны увидеть, что каждый из них должен разыгрывать каждый, чтобы использовать его.
Стандартная организационная структура C - это Файл, с интерфейсы в заголовке и реализации в источнике.
Именно так выполняется libc, и именно так выполняются почти все библиотеки C.
Компиляторы Moder C позволяют вам определять и реализовывать функции в одном исходном файле и даже выполнять статические функции в файлах заголовков. Это, к сожалению, приводит к некоторой путанице в отношении того, что происходит там, и вы можете получать необычные решения, такие как функции cramming, в структуры, исходные программы без заголовков и т.д. Вы теряете преимущество разделения интерфейса от реализации таким образом.
Ответ 7
Нет, ты не можешь. Структура не может содержать объявление функции, но может содержать определение функции. Структура может содержать только типы данных, указатели, указатели на разные функции. Вы можете сделать указатель на функцию, а затем получить доступ к структуре.
#include<iostream>
#include<cstring>
using namespace std;
struct full_name
{
char *fname;
char *lname;
void (*show)(char *,char*);
};
void show(char *a1,char * a2)
{
cout<<a1<<"-"<<a2<<endl;
}
int main()
{
struct full_name loki;
loki.fname="Mohit";
loki.lname="Dabas";
loki.show=show;
loki.show(loki.fname,loki.lname);
return 0;
}