我对如何在源文件或结构本身中定义结构函数感到困惑。是的我已经阅读了类似的Stack Overflow问题,但是询问您是否可以定义结构本身声明的函数。基本上在简单的事情上,我有这个" NetworkDriver"结构:
typedef struct
{
char *name;
bool initialized;
int32_t status;
int (*initialize)(void);
} NetworkDriver;
正如您所看到的,我正在尝试定义已在结构中初始化的函数指针。我们该怎么做呢?
答案 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);
}