26

我开始使用 C 编程。我目前有一个包含很多功能的大文件。我想将这些函数移到单独的文件中,以便代码更易于阅读。但是,我似乎无法弄清楚如何正确包含/编译,并且在我找到的任何在线教程中都找不到示例。这是一个简化的示例:

#include <stdlib.h>
#include <stdio.h>

void func1(void) {
  printf("Function 1!\n");
}

void func2(void) {
  printf("Function 2!\n");
}

int main(void) {
  func1();
  func2();
  return 0;
}

如何将 C 函数移动到单独的文件中?仅供参考:我正在使用 gcc。

更新:这些答案非常有帮助,谢谢。现在看来,我的简化示例还不够好,因为我意识到我的程序无法编译的原因是因为我在函数中使用了全局变量。

#include <stdlib.h>
#include <stdio.h>

int counter = 0;

void func1(void) {
  printf("Function 1!\n");
  counter++;
}

int main(void) {
  func1();
  return 0;
}

将这些函数移动到外部文件不起作用,因为它们需要引用这个全局变量:

#include <stdlib.h>
#include <stdio.h>
#include "functions.c"

int counter = 0;

int main(void) {
  func1();
  counter = 100;
  return 0;
}

我该如何解决这个问题?

4

4 回答 4

36

好的。开始了。

您的main.c文件

#include <stdlib.h>
#include <stdio.h>
#include "functions.h"

int main(void) {
  func1();
  func2();
  return 0;
}

您的functions.h文件

void func1(void);
void func2(void);

您的functions.c文件

#include "functions.h"

void func1(void) {
  printf("Function 1!\n");
}

void func2(void) {
  printf("Function 2!\n");
}

编译它:

gcc -o main.exe main.c functions.c
于 2013-11-01T18:37:06.000 回答
11

最常见的方法是将函数原型放在头文件中,将函数实现放在源文件中。例如:

函数1.h

#ifndef MY_FUNC1_H
#define MY_FUNC1_H
#include <stdio.h>

// declares a variable
extern int var1;

// declares a function
void func1(void);
#endif

函数1.c

#include "func1.h"

// defines a variable
int var1 = 512;

// defines a function
void func1(void) {
    printf("Function 1!\n");
}

函数2.h:

#ifndef MY_FUNC2_H
#define MY_FUNC2_H
#include <stdio.h>
void func2(void);
#endif

功能2.c:

#include "func1.h" // included in order to use var1
#include "func2.h"
void func2(void) {
    printf("Function 2 with var1 == %i\n", var1);
}

主.c:

#include <stdio.h>
#include "func1.h"
#include "func2.h"

int main(void) {
    var1 += 512;
    func1();
    func2();
    return 0;
}

然后,您将使用以下内容进行编译:

gcc -c -o func1.o func1.c
gcc -c -o func2.o func2.c
gcc -c -o main.o  main.c
gcc -o myprog main.o func1.o func2.o
./myprog

为了说明,我只在每个源/标头对中放置了一个函数。您可以只创建一个包含所有源文件原型的头文件,也可以为每个源文件创建多个头文件。关键是任何将调用函数的源文件都需要包含一个包含函数原型的头文件。

作为一般规则,您只希望包含一次头文件,这是#ifndef #define #endif头文件中的宏的目的。

于 2013-11-01T18:49:37.010 回答
5

首先,您必须了解声明定义之间的区别。声明告诉编译器存在某些东西,例如函数。对于函数,定义是实际的函数实现。

因此,您所做的是将定义移至另一个文件,但在要调用函数的文件中添加声明。然后,您将两个文件一起构建,编译器和链接器将负责其余的工作。

于 2013-11-01T18:26:26.207 回答
-2

你可以做这样的事情。

    /* func1.c */
    void func1(void) {
      printf("Function 1!\n");
    }

    /* func2.c */
    void func2(void) {
      printf("Function 2!\n");
    }

    /* main.c */
    #include "func1.c"
    #include "func2.c"

    int main ( void )
    {
    func1();
    func2();
    return 0;
    }
于 2013-11-01T18:33:34.137 回答