是否有必要写#include< stdio.h中>在一个单独的文件中的每个函数? C

时间:2017-05-21 12:45:58

标签: c

我最近开始学习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,但我收到警告。

提前致谢!

2 个答案:

答案 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进行编译,请不要忘记启用所有警告&amp;调试信息,使用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)。