C - 在文件

时间:2016-11-03 22:24:33

标签: c module linker

我是一名普通Java技能的初学者,我不确定如何正确地在文件之间重用C代码。

假设我有两个文件/模块:server.cclient.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中是否有类似的方法?

1 个答案:

答案 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);
    }
}