如何在源文件或结构本身中定义结构函数

时间:2016-07-01 01:01:19

标签: c struct

我对如何在源文件或结构本身中定义结构函数感到困惑。是的我已经阅读了类似的Stack Overflow问题,但是询问您是否可以定义结构本身声明的函数。基本上在简单的事情上,我有这个" NetworkDriver"结构:

typedef struct
{
    char *name;
    bool initialized;
    int32_t status;
    int (*initialize)(void);
} NetworkDriver;

正如您所看到的,我正在尝试定义已在结构中初始化的函数指针。我们该怎么做呢?

3 个答案:

答案 0 :(得分:3)

标记为CollectionViewSource myViewSource = ((CollectionViewSource)(FindResource("myViewSource"))); if (myViewSource.View != null) myViewSource.View.MoveCurrentToFirst(); 不是 C ++)的问题应该注意,C中没有C这样的内容。在给定的代码段中, struct function只是struct typedef的数据成员,因为initialize被声明为一个指向函数的指针,该函数不带参数并返回NetworkDriver

定义和使用变量的机制与任何函数指针的机制相同:它必须设置为指向具有给定原型的函数,然后可以使用通常的函数语法调用它。

int

答案 1 :(得分:0)

不确定我是否遇到问题;你在代码片段中所做的是声明一个类型。目前还没有这种类型的实例可以初始化;你需要声明一个实例;要么将其添加到最后一行:}NetworkDriver var;,要么之后添加另一行:NetworkDriver var;

无论哪种方式,您都可以通过向其添加={"whatever",true,0,&function}来初始化此实例;或者通过添加另一行var.initialize = &funciton;来专门仅指该函数指针。

答案 2 :(得分:0)

以下是我最接近你所说的内容。我做了一些更改(使用int而不是bool),还在NetworkDriver结构中添加了一个函数指针,并为函数添加了参数。

但是,您似乎希望NetworkDriver的每个实例都有自己的initialize函数。但我所做的是我已经定义了initialize函数一次,NetworkDriver的每个实例都有一个指向它的指针。不完全像你说的那样,但这是我能想到的。

正如dxib在他的回答中提到的,仍然必须明确地调用这些函数。我不像C++中的构造函数。在调用之前,必须为结构中的这些functin指针明确地分配函数的地址。

#include<stdio.h>
#include<stdlib.h>

#define TRUE  1
#define FALSE 0

#define NO_ERR          10
#define NAME_ERR        11
#define INITIALIZED_ERR 12

typedef struct
{
    char *name;
    int initialized;
    int32_t status;
    int (*initialize)(void *, char *); 
    void (*disp_info)(void *); /* Note: one more func pointer */
}NetworkDriver;


/* Function prototype declarations */
int nd_init(void *ndr, char *name);
void nd_disp_info(void *ndr);

/* main: test NetworkDriver and nd_init */
int main(void)
{
    NetworkDriver nd; 

    nd.initialized = FALSE;
    nd.initialize = nd_init;
    nd.disp_info = nd_disp_info;

    if (nd.initialize(&nd, "foo")) { /* Initialize driver */
            printf("Error: Initialization error\n");
            exit(1);
    }

    nd.disp_info(&nd);  /* display nd's info */

/* nd_init: initialize a NetworkDriver */
int nd_init(void *ndr, char *name)
{
    NetworkDriver *nd;

    nd = (NetworkDriver *) ndr;

    if (!(nd->name = name)) {
            nd->status = NAME_ERR;
            return 1;
    }


    if (nd->initialized != TRUE) {
            if (!(nd->initialized = TRUE)) {
                    nd->status = INITIALIZED_ERR;
                    return 1;
            }
    }


    /* Successfully initialized */
    nd->status = NO_ERR;
    return 0;
}

/* nd_disp_info: display NetworkDriver info  */
void nd_disp_info(void *ndr)
{
    NetworkDriver *nd;

    nd = (NetworkDriver *) ndr;

    /* If this driver was not initialized without err */
    if (nd->status != NO_ERR) {
            printf("NetworkDriver was not initialized correctly\n");
            return;
    }

    /* Print info */
    printf("=== NetworkDriver info ===\n");
    printf("Name: %s\n", nd->name);
    printf("Initialized ? %s\n", nd->initialized == TRUE ? "TRUE" :
                           "FALSE");
    printf("Status: %d\n", (int) nd->status);
}