我最近开始学习C语言。我正在使用Eclipse,我想创建一个程序,其中每个函数都在不同的文件中。我的问题如下:
这在我的main.c文件中:
#include <stdio.h>
#include <stdlib.h>
#include "header.h"
int main(void) {
function();
system("pause");
return EXIT_SUCCESS;
}
我的header.h:
#ifndef HEADER_H_
#define HEADER_H_
void function (void);
#endif /* HEADER_H_ */
我的function.c:
#include <stdio.h> //Necessary??
void function (void){
printf("Hello\n");
}
是否有必要写#include&lt; stdio.h&gt;,#include&lt; stdlib.h&gt;等在每个函数中?该程序在function.c中没有#include,但我收到警告。
提前致谢!
答案 0 :(得分:4)
您只为在您正在使用的标头中声明的那些函数包含适当的标头。
在您的示例中,main.c
- 您不需要包含#include <stdio.h>
。但是在function.c
中你需要包含它(stdio.h)。这是因为您在代码中使用了函数printf
。
答案 1 :(得分:2)
详细了解C preprocessor(以及here)。您经常(并且常规,因此它更好地习惯而不是要求)会在您的开头附近添加#include <stdio.h>
预处理器include directive翻译单元(或在头文件的开头附近),即您的*.c
源文件。当然,您只需要使用一些标准I / O函数(或类似<stdio.h>
的类型名称或FILE
之类的变量)在翻译单元中包含stdout
。因此,您可以避免与I / O无关的模块中的<stdio.h>
,例如仅执行计算的代码。
您当然不需要为每个源文件定义一个函数。在一个源文件中定义几个函数是很常见的(我甚至建议它)。特别是,您可以声明static
某些内部函数并从另一个函数中调用它(在同一个translation unit中)。
您可能希望GCC有一个pre-compiled header(实际上必须包含其他内容),并且您可以决定将所有标准标题包含在header.h
中。阅读include guards。
您可能希望定义(不仅仅是声明)static inline
中的一些简短header.h
函数,希望编译器inline对它们进行大多数调用
您的function.c
实际上需要#include <stdio.h>
,因为它正在使用printf
。如果您错过了,则需要正确声明printf
。
gcc -Wall -Wextra -g
。然后尝试使用gcc -C -E function.c > function.i
获取预处理表单,然后使用pager(或编辑器)查看生成的function.i
。另请参阅this。
请注意,Eclipse 不是compiler 而是IDE,这是一个美化的source code editor能够运行其他程序(如编译器,调试器等) ...)。你的编译器 - 由Eclipse开始 - 很可能是GCC(或Clang/LLVM)。
NB。 C语言编程需要定义和遵循许多约定,这些约定可能因项目而异。但是你会更好地表达它们。我建议研究一些中小型free software项目的源代码(例如github)。