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

Функции в структуре

Могут ли структуры содержать функции?

4b9b3361

Ответ 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;     
}