除了main.c
文件,我的项目中还有以下my_custom_data_structure.c
文件。我的my_custom_data_structure.c
文件包含很多变量、函数等。
我在main.c
中使用#include "my_custom_data_structure.c"
指令.
问题
我只想从my_custom_data_structure.c
导入一个名为foo
的函数。我不需要my_custom_data_structure.c
文件中声明的所有变量和函数。
任何见解都值得赞赏。
文件结构
-
|- main.c
|- my_custom_data_structure.c
my_custom_data_structure.c的内容
#include <stdio.h>
int DELAY = 20;
int SPEED = 7;
char GRANULARITY_CHAR = 'g';
unsigned int RANGE = 3;
void foo(){
// TODO: In future, this function will print SPEED.
printf("foo works!");
}
/*
The rest of this file is filled by a lot
of code, which is not needed for main.c
*/
主要内容
#include <stdio.h>
#include "my_custom_data_structure.c"
int DELAY = 3;
int main(){
foo();
printf("Delay is %d", DELAY);
return 0;
}
更新:添加了工作示例
通常的方法是单独编译它们。所以你有你的main.c
和你的extra.c
,你应该创建一个extra.h
(并将其包含在main.c
中(。
在此extra.h
中,为要从extra.c
文件导出的任何内容输入声明。
例如,应该可用于其他文件的任何函数。所有其他函数应仅在extra.c
中声明/定义为静态函数,以便在编译main.c
时它们不能用作要链接的符号。
通常,您不会在其他源文件(或标头中(中包含源文件 (.c
(。 这是可能的(有时是必要的(,但这并不常见。
除非已将my_custom_data_structure.c
设计为允许您指定要编译的函数,否则您将获得文件中的所有内容。 例如,您可以使用:
#ifdef USE_FUNCTION1
void function1(void *, …)
{
…
}
#endif /* USE_FUNCTION1 */
围绕每个功能,然后排列到
#define USE_FUNCTION1
在包含来源之前,但这通常不是一种好的工作方式。这很繁琐。您必须知道您使用哪些函数,以及这些函数需要哪些其他函数,等等,并且容易受到更改的影响,使USE_FUNCTIONn
定义列表不准确。 当然,源代码可能包含如下代码块:
#ifdef USE_FUNCTION1
#define USE_FUNCTION37
#define USE_FUNCTION92
#define USE_FUNCTION102
#endif /* USE_FUNCTION1 */
因此,如果您说使用function1()
,它会自动编译所需的其他函数,但是即使定义是USE_MEANINGFUL_NAME
而不是数字,维护这些定义列表也很繁琐。
创建一个标头(my_customer_data_structure.h
(声明函数和所需的任何类型,并将实现拆分为许多文件(mcds_part1.c
,mcds_part2.c
,...(。 将单独的实现文件编译到库中(例如libmcds.a
(,然后将程序与库链接。 如果是静态库,则只有那些直接或间接使用的函数才会包含在可执行文件中。