如何将我的 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 文件。
我想把我的 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 文件。