C - 仅包含特定功能

  • 本文关键字:功能 包含特 c import
  • 更新时间 :
  • 英文 :


除了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.cmcds_part2.c,...(。 将单独的实现文件编译到库中(例如libmcds.a(,然后将程序与库链接。 如果是静态库,则只有那些直接或间接使用的函数才会包含在可执行文件中。

最新更新