我最近开始学习C语言。我正在使用Eclipse,我想创建一个程序,其中每个函数都在不同的文件中。我的问题如下:
这在我的 main.c 文件中:
#include <stdio.h>
#include <stdlib.h>
#include "header.h"
int main(void) {
function();
system("pause");
return EXIT_SUCCESS;
}
我的标题.h:
#ifndef HEADER_H_
#define HEADER_H_
void function (void);
#endif /* HEADER_H_ */
和我的函数.c:
#include <stdio.h> //Necessary??
void function (void){
printf("Hellon");
}
是否有必要在每个函数中编写 #include
提前感谢!
阅读有关 C 预处理器的更多信息(也点击此处)。您经常(并且按照惯例,因此这更像是一个好习惯而不是一个要求)会在翻译单元的开头附近(或头文件的开头附近)添加一个#include <stdio.h>
预处理器 include 指令,即您的*.c
源文件。当然,您只需要使用某些标准I/O函数(或类型名称如FILE
,或变量如stdout
)在翻译单元中包含<stdio.h>
。因此,您可以避免与 I/O 无关的模块中的<stdio.h>
,例如仅执行计算的代码。
当然,您不需要为每个源文件定义一个函数。在一个源文件中定义多个函数是很常见的(我什至推荐它)。特别是,您可以声明static
某个内部函数并从另一个函数(在同一翻译单元中)调用它。
对于 GCC,您可能希望有一个预编译的标头(实际上必须包含其他标头),并且您可以决定将所有标准标头包含在您的header.h
中。阅读有关包括警卫的信息。
你可能想在你的header.h
中定义(而不仅仅是声明)一些短static inline
函数,希望编译器能够内联对它们的大多数调用。
您的function.c
实际上需要#include <stdio.h>
,因为它正在使用printf
。如果您错过了包含,则需要正确声明printf
。
顺便说一句,如果您使用 GCC 编译,请不要忘记使用gcc -Wall -Wextra -g
启用所有警告和调试信息。并尝试一次使用gcc -C -E function.c > function.i
获取预处理的表单,然后使用寻呼机(或编辑器)查看生成的function.i
。另请参阅此内容。
请注意,Eclipse不是一个编译器,而是一个 IDE,它是一个能够运行其他程序(如编译器、调试器等)的美化源代码编辑器。由Eclipse启动的编译器可能是GCC(或Clang/LLVM)。
另请阅读现代 C书籍。
铌。用 C 语言编程需要定义并遵循许多约定,这些约定可能因项目而异。但你最好把它们说清楚。我建议研究一些中小型自由软件项目的源代码(例如在github上)。
您只包含您正在使用的标头中声明的那些函数的相应标头。
在您的示例中,main.c
- 您不需要包含#include <stdio.h>
。但是,在function.c
中,您确实需要包含它(stdio.h)。这是因为您正在使用代码中的函数printf
。