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

标签 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_ */

还有我的函数.c:

#include <stdio.h> //Necessary??

void function (void){
    printf("Hello\n");
}

是不是每个函数都要写#include、#include等?该程序在 function.c 中没有 #include 的情况下工作,但我收到警告。

提前致谢!

最佳答案

阅读更多关于 C preprocessor 的信息(还有 here )。您经常(并且按照惯例,所以这是一个好习惯而不是要求)会添加 #include <stdio.h>预处理器 include directive在翻译单元的开头附近(或在头文件的开头附近),即您的 *.c源文件。当然你需要包括<stdio.h>仅在使用某些标准 I/O 函数(或类似 FILE 的类型名称,或类似 stdout 的变量)的翻译单元中。所以你可以避免 <stdio.h>在与 I/O 无关的模块中,例如仅执行计算的代码。

您当然不需要为每个源文件定义一个函数。在一个源文件中定义多个函数是很常见的(我什至推荐这样做)。特别是,您可以声明 static一些内部函数并从另一个函数调用它(在同一个 translation unit 中)。

您可能需要 GCC , 有一个 pre-compiled header (实际上必须包括其他的),并且您可以决定将所有标准 header 包含在您的 header.h 中。 .了解 include guards .

您可能想要定义(不仅是声明)一些短的 static inline在您的 header.h 中发挥作用,希望编译器会 inline大多数电话给他们。

你的 function.c实际上需要 #include <stdio.h>因为它正在使用 printf .如果你错过了那个包含你需要正确声明printf .

顺便说一句,如果你用 GCC 编译,不要忘记启用所有警告和调试信息,使用 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 )。

另请阅读 Modern C书。

注意。用 C 语言编程需要定义和遵循许多约定,这些约定可能因项目而异。但你最好把它们明确化。推荐研究一些中小型的源码free software项目(例如 github )。

关于c - 是否需要在单独文件中的每个函数中编写#include<stdio.h>? C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44097025/

相关文章:

c - "Undefined symbol <function> first referenced in file <file>"链接错误

c - 使用Fatfs写入uint32_t数组

c - 为什么带有 listen(sockfd, 2) 调用的服务器能够接受 3 个连接?

c++ - 选择编码和字符串处理

c - 数组结构体和数组

c - scanf 终止标准输入

java - 使用Java原生接口(interface)时出现 "fatal: relocations remain against allocatable but non-writable sections"如何解决?

c - 如何找到文件的完全限定路径名?

c - 未初始化的变量如何获得垃圾值?

C 指针和 malloc 混淆 EXC_BAD_ACCESS