首页 > 解决方案 > 如果每个需要的库都包含在我的 main 中,我是否需要在具有函数实现的文件中 #include 任何内容?

问题描述

好的,所以我正在编写一个程序,我们称之为:writing.c 我已经在 : 中编写了两个函数实现,functions.c并且 functions.h包括(但我使用 printf 和其他依赖于<stdio.h>etc 的函数,但我不包括在这里)。

然后我有writing.c哪个有main,并调用函数,通常它是一个完整的程序。这里有#include我需要的一切

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include "help.h"
#include "functions.h"

functions.c 当我编译它时,编译器似乎无法识别其中的一个函数writing.c

warning: implicit declaration of function ‘f1.."

我在这里错过了一些#include 吗?

标签: ccompiler-errorsheader-files

解决方案


“functions.c”,其中仅包括“functions.h”(但我使用 printf 和其他依赖于 <stdio.h> 等的函数,但我不在这里表示)。

您应该#include将翻译单元需要的所有文件放入该翻译单元。为什么你故意包括他们?请注意,每个翻译单元 (.c) 文件首先相互独立编译,然后才链接在一起。链接将找到未解析符号的定义,但声明需要存在于每个翻译单元中。因此,换句话说,您包含的main.c内容与是否functions.c编译无关。

Short example to demonstate this:
//a.h
void f();

//a.c
#include 
void f()
{
    printf("hello");
}

无论其他文件包含什么,这个 ac 文件都不会编译。因为在编译这个特定的 .c 文件时,不会考虑其他文件(直接或间接包含在其中的文件除外)。


推荐阅读