结构中的C函数

我试图创build一个结构内的function,到目前为止,我有这样的代码:

typedef struct client_t client_t, *pno; struct client_t { pid_t pid; char password[TAM_MAX]; // -> 50 chars pno next; pno AddClient() { /* code */ } }; int main() { client_t client; //code .. client.AddClient(); } 

错误client.h:24:2:error:expected':',',',';','}'或' attribute'before '{'token。

哪种方法是正确的?

它不能直接完成,但你可以使用函数指针来模拟相同的事情,并显式地传递“this”参数:

 typedef struct client_t client_t, *pno; struct client_t { pid_t pid; char password[TAM_MAX]; // -> 50 chars pno next; pno (*AddClient)(client_t *); }; pno client_t_AddClient(client_t *self) { /* code */ } int main() { client_t client; client.AddClient = client_t_AddClient; // probably really done in some init fn //code .. client.AddClient(&client); } 

事实certificate,这样做,然而,并不真正给你买了很多。 因此,您将不会看到许多以这种风格实现的C API,因为您可能只需调用您的外部函数并传递实例即可。

正如其他人所指出的那样,将函数指针直接embedded到结构中通常是为特殊目的而保留的,如callback函数。

你可能想要的东西更像是一个虚拟方法表。

 typedef struct client_ops_t client_ops_t; typedef struct client_t client_t, *pno; struct client_t { /* ... */ client_ops_t *ops; }; struct client_ops_t { pno (*AddClient)(client_t *); pno (*RemoveClient)(client_t *); }; pno AddClient (client_t *client) { return client->ops->AddClient(client); } pno RemoveClient (client_t *client) { return client->ops->RemoveClient(client); } 

现在,添加更多的操作不会改变client_t结构的大小。 现在,这种灵活性只有在需要定义多种客户端时才有用,或者希望允许client_t接口的用户能够增加操作的行为方式。

这种结构确实出现在真实的代码中。 OpenSSL BIO层看起来与此类似,并且UNIX设备驱动程序接口也具有这样的层。

这只会在C ++中起作用。 结构中的函数不是C的一个特征

同样适用于你的client.AddClient(); 调用…这是一个成员函数的调用,这是一个面向对象的编程,即C ++。

将您的源代码转换为.cpp文件,并确保您正在编译。

如果你需要坚持C,下面的代码是(有点)的等价物:

 typedef struct client_t client_t, *pno; struct client_t { pid_t pid; char password[TAM_MAX]; // -> 50 chars pno next; }; pno AddClient(pno *pclient) { /* code */ } int main() { client_t client; //code .. AddClient(client); } 

这个怎么样?

 #include <stdio.h> typedef struct hello { int (*someFunction)(); } hello; int foo() { return 0; } hello Hello() { struct hello aHello; aHello.someFunction = &foo; return aHello; } int main() { struct hello aHello = Hello(); printf("Print hello: %d\n", aHello.someFunction()); return 0; } 

您正试图按照结构分组代码。 C分组是由文件。 你把所有的函数和内部variables放在一个头文件或一个头文件和一个由ac源文件编译的对象“.o”文件中。

对于一个不是面向对象语言的C程序来说,从头开始重新devise面向对象是没有必要的。

我以前见过这个。 这是一件奇怪的事情。 编码器中的一些人厌恶将他们想要改变的对象传递给改变它的函数,尽pipe这是标准的方式。

我责怪C ++,因为它隐藏了类对象始终是成员函数中的第一个参数的事实,但它是隐藏的。 所以它看起来并不是将对象传递给函数,即使它是。

 Client.addClient(Client& c); // addClient first parameter is actually // "this", a pointer to the Client object. 

C是灵活的,可以通过引用传递事物。

AC函数通常只返回一个状态字节或者int,而且通常被忽略。 在你的情况下,一个适当的forms可能是

  err = addClient( container_t cnt, client_t c); if ( err != 0 ) { fprintf(stderr, "could not add client (%d) \n", err ); 

addClient将在Client.h或Client.c中