Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-在文件之间正确重用代码/方法_C_Module_Linker - Fatal编程技术网

C-在文件之间正确重用代码/方法

C-在文件之间正确重用代码/方法,c,module,linker,C,Module,Linker,我是一个具有一般Java技能的C初学者,我不知道如何在文件之间正确地重用C代码 假设我有两个文件/模块:server.c和client.c static const char *progname = "client"; static int sockfd = -1; static int connfd = -1; // I want to use free_resources here 它们没有链接(与GCC),应该在单独的进程中运行 在server.c中有两种方法我想在client.c中

我是一个具有一般Java技能的C初学者,我不知道如何在文件之间正确地重用C代码

假设我有两个文件/模块:
server.c
client.c

static const char *progname = "client";

static int sockfd = -1;
static int connfd = -1;

// I want to use free_resources here
它们没有链接(与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语言中有类似的方法吗

在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外部调用)


“如何访问全局变量”。在这个上下文中,“我”是谁?@kaylum我将在server.c和client.c中包含的实用程序模块(?)util.c。但是这些变量可能也在util.c中。因此,该文件中的任何函数都可以访问它们。你打算怎么做?如果您需要访问文件外部的变量,则该文件中的一个API将返回这些变量。只要这些变量不需要在client.c和server.c之间共享,您就可以将util.c与其他每个模块静态链接,并在其他每个模块中将全局变量用作外部变量。不要在util.c中将它们声明为静态。请在c教程中查找“外部变量”。谢谢。这与前面提到的使用外部变量相比有什么不同?@MWin123有两个主要区别。1) 使用该结构可以减少名称空间污染,例如,结构中的名称
sockfd
永远不会与名为
sockfd
的局部变量冲突,因为前者位于结构命名空间中,而不是全局命名空间中。2) 您可以拥有该结构的多个实例,其方式与拥有一个类的多个实例完全相同。你现在可能不需要,但将来你永远不知道。