我是一名普通Java技能的初学者,我不确定如何正确地在文件之间重用C代码。
假设我有两个文件/模块:server.c
和client.c
它们没有链接(与GCC),应该在不同的进程中运行。
我想在server.c
中使用client.c
中的两种方法。这些方法在同一模块中使用全局,静态(const)变量。基本上我想要的功能与我将它们复制到另一个文件时相同。
小例子:
server.c
static const char *progname = "server";
static int sockfd = -1;
static int connfd = -1;
static void free_resources(void)
{
if (sockfd >= 0) {
(void) close(sockfd);
}
if (connfd >= 0) {
(void) close(connfd);
}
}
client.c
static const char *progname = "client";
static int sockfd = -1;
static int connfd = -1;
// I want to use free_resources here
如果我想在client.c
中使用相同的方法,那么正确的做法是什么?
如果我使用该方法创建单独的util.c
/ util.h
模块,如何访问全局变量?我应该每次都把它们作为参数传递吗?删除静态?
在Java中,我可能会创建一个类并传递(引用)全局变量一次。 C中是否有类似的方法?
答案 0 :(得分:1)
在Java中,我可能会创建一个类......
C中的等价物是创建一个结构,并将指向结构的指针传递给需要访问变量的任何函数。结构声明应该在utils.h中,例如
typedef struct
{
char *progname;
int sockfd;
int connfd;
}
Info;
void free_resources( Info *info );
在server.c和client.c中创建并初始化结构,然后将地址传递给公共函数,例如
Info server_info = { "server", -1, -1 };
int main( void )
{
// ...
free_resources( &server_info );
}
然后utils.c中的代码如下所示。 (请注意,您不能使用static
关键字,因为该函数必须可以从utils.c外部调用。)
void free_resources( Info *info )
{
if (info->sockfd >= 0) {
(void) close(info->sockfd);
}
if (info->connfd >= 0) {
(void) close(info->connfd);
}
}