如何将我的 C 代码拆分到不同的文件中

How can I split my C code in different files

我想把我的 C 代码拆分成多个文件,因为它现在有 3,000 多行,我想组织我的代码。这是我在单个文件中的代码的简化版本:

lib.c

#if defined(_WIN32)
#  define MAIN_EXPORT_API __declspec(dllexport)
#else
#  define MAIN_EXPORT_API
#endif

typedef struct Vertex Vertex;
typedef struct Element Element;
typedef struct Grid Grid;

struct Vertex {
    int index;
    Element *element;
};
struct Element {
    int index;
    Vertex vertex;
};
struct Grid {
    Vertex *vertex;
    Element *element;
};

MAIN_EXPORT_API Vertex Vertex_init (int index) {
    Vertex vertex;
    vertex.index = index;
    return vertex;
}
MAIN_EXPORT_API Element Element_init (int index, Vertex *vertexPtr) {
    Element element;
    element.index = index;
    vertexPtr->element = &element;
    return element;
}
MAIN_EXPORT_API Grid Grid_init () {
    Grid grid;
    Vertex vertex = Vertex_init(0);
    Element element = Element_init(0, &vertex);
    grid.vertex = &vertex;
    grid.element = &element;
    return grid;
}

然后我尝试着用下面的方式开始拆分:

new_lib.h

#if defined(_WIN32)
#  if defined(LIB_EXPORTS)
#    define LIB_EXPORT_API __declspec(dllexport)
#  else
#    define LIB_EXPORT_API __declspec(dllimport)
#  endif
#else
#  define LIB_EXPORT_API
#endif

typedef struct Vertex Vertex;
typedef struct Element Element;
typedef struct Grid Grid;

struct Vertex {
    int handle;
    Element *element;
};
struct Element {
    int handle;
    Vertex vertex;
};
struct Grid {
    Vertex *vertex;
    Element *element;
};

new_lib.c

#define LIB_EXPORTS
#include "new_lib.h"

Element Element_init (int handle, Vertex *vertexPtr) {
    Element element;
    element.handle = handle;
    vertexPtr->element = &element;
    return element;
}
Grid Grid_init () {
    Grid grid;
    Vertex vertex = Vertex_init(0);
    Element element = Element_init(0, &vertex);
    grid.vertex = &vertex;
    grid.element = &element;
    return grid;
}

vertex.h

#if defined(_WIN32)
#  if defined(VERTEX_EXPORTS)
#    define VERTEX_EXPORT_API __declspec(dllexport)
#  else
#    define VERTEX_EXPORT_API __declspec(dllimport)
#  endif
#else
#  define VERTEX_EXPORT_API
#endif

#include "lib.h"

VERTEX_EXPORT_API Vertex Vertex_init (int handle);

vertex.c

#define VERTEX_EXPORTS
#include "vertex.h"

Vertex Vertex_init (int handle) {
    Vertex vertex;
    vertex.handle = handle;
    return vertex;
}

当我编译它时,我得到:

C:\>
C:\>cl /nologo /DDLL vertex.c /link /NOLOGO /DLL /OUT:vertex.dll
vertex.c
   Creating vertex.lib library and vertex.exp object 

C:\>cl /nologo /DDLL new_lib.c /link /NOLOGO /DLL /OUT:new_lib.dll vertex.lib
new_lib.c
new_lib.c(12): error C2440: 'initializing': cannot convert from 'int' to 'Vertex'

C:\>
C:\>

有人能帮忙吗?

我们在c语言中拆分代码时,最需要注意的事情之一就是编译。当代码进入不同的文件时,每个文件都需要单独编译,这将有助于在任何情况下更改代码,因为只有更改的文件才需要重新编译。 这样做的主要方法是: 首先创建一个 makefile,其中包括为每个文件编译,有一个 makefile 的示例:

生成文件示例

myprog: f1.o f2.o f3.o
        gcc -g -Wall -ansi -pedantic  f1.o f2.o f3.o -o myprog -lm      
f1.o:f1.c data.h
        gcc -c -Wall -ansi -pedantic  f1.c -o f1.o -lm
f2.o:f2.c data.h
        gcc -c -Wall -ansi -pedantic  f2.c -o f2.o -lm
f3.o:f3.c data.h
        gcc -c -Wall -ansi -pedantic  f3.c -o f3.o -lm

在此 makefile 示例中,我们可以看到如何包含每个文件以及如何在需要时单独包含它们的 .h 文件。