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

3

我最近开始学习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< stdio.h>, #include< stdlib.h>等吗?在function.c文件中没有#include,程序可以正常工作但是会有一个警告。

提前致谢!


你不能简单地将它们添加起来,然后编译并查看缺失的部分,并将它们添加到应该在的位置。 - undefined
为什么你想要将每个函数放在不同的文件中?我觉得这是一个非常不好的习惯(但如果你真的想这样做,你可以这样)。 - undefined
@BasileStarynkevitch 或许我错了,因为我是新手。但我认为每个源文件只有一个或几个函数会使程序看起来更整洁,也更容易找到想要编辑的部分(滚动时间更短...)。非常感谢您之前的回答,非常详尽。 - undefined
看看现有的实践(用C语言编写的自由软件)。你会发现许多文件,每个文件有几千行代码,包含数十个函数。但这只是一种习惯问题。你也可以写一个程序,使用成千上百个只有几十行代码的短文件(但编译速度会慢一些),每个文件只有一个函数定义。 - undefined
顺便说一句,据传Eclipse在编写C代码方面并不是很好。你有没有考虑过转换到一个更强大的源代码编辑器(例如最近的emacs或者vim配合适当的扩展)? - undefined
@BasileStarynkevitch 我会听从你的建议,阅读一些现有的代码。我认为这是学习如何组织程序的好方法。关于Eclipse,它似乎对我目前的工作来说还可以。作为一个初学者,我不认为使用最强大或最高效的代码编辑器很重要。但非常感谢你的建议。 - undefined
2个回答

5

阅读有关C预处理器的更多信息(还有这里)。通常情况下(并且是惯例,所以这更像是一个好习惯而不是要求),您会在翻译单元的开头(或者在头文件的开头)添加一个#include <stdio.h>预处理器包含指令,即您的*.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。如果你忘记了这个 include,你需要正确地声明 printf
顺便说一下,如果你使用 GCC 编译,请不要忘记启用所有警告和调试信息,使用 gcc -Wall -Wextra -g。并尝试一次使用 gcc -C -E function.c > function.i 获取预处理形式,然后使用 pager(或编辑器)查看生成的 function.i。另请参见 this

请注意,Eclipse并不是一个编译器,而是一个集成开发环境(IDE),它是一个强化的源代码编辑器,能够运行其他程序(如编译器、调试器等)。由Eclipse启动的编译器可能是GCC(或Clang/LLVM)。

还要阅读现代C书籍。

NB.在C语言编程中需要定义和遵循许多惯例,这些惯例可能因项目而异,但您最好明确它们。我建议研究一些小型或中型自由软件项目的源代码(例如在GitHub上)。


4

你只需要在使用的头文件中包含相应函数的适当头文件。

以你的示例为例,main.c - 你不需要包含 #include <stdio.h>。但是在 function.c 中,你需要包含它(stdio.h)。这是因为你在代码中使用了函数 printf


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接