在自定义函数中再次包含相同的头文件,哪些已经包含在主程序中?

Including the same header files in a self-defined function again, which are already included in the main programm?

如果我已经在主程序(调用者)中包含相同的头文件,我是否应该在该特定函数的头文件或函数定义文件中包含它们?

例如:

/* Text of main programm */
#include <stdlib.h>                    /* Including the headers first */
#include <stdio.h>
#include <function.h>

int function(void);

int main (void)
{
     /* stdio.h is needed in main with f.e.
     printf("Let us using function!); */
     function();
     return(0);
}
_____________________________________________________________________

/* Headerfile for function ("function.h") */
/*
#include <stdlib.h>                Should I include the headers again here? 
#include <stdio.h> 
*/

int function (void);
_____________________________________________________________________

/* Definition of function ("function.c")*/

/*
#include <stdlib.h>                Should I include the headers again here? 
#include <stdio.h> 
*/

int function (void)
{
     printf("You know it right, baby!\n");
}

如果我想在自定义函数中使用一个特殊的头文件及其函数,但在主程序中不需要它呢?

我使用C,但以后想使用C++。如果每个答案之间的任何差异与使用相关,请提及。

非常感谢您的回答。

不,您应该在文件 F 中仅包含您在文件 F 中声明或引用(使用)的内容所需的那些文件。

换句话说,在你的 main 中你不需要 stdio.h 和 stdlib.h,因为你的 main 不使用它们。但是你需要 function.h 因为你将使用 function().

此外,在您的主体中,您声明:

int function(void);

但是您之前所做的相同声明已经在 function.h 中 #include。

在您的示例中,如果您直接声明 function() 的正确原型,则您不再需要包含 function.h!


另一方面,可以经常包含正确(和简单)形成的头文件,即使它们无用或多余。它们会减慢编译速度,但不会产生有害影响。

没有。如果您的 main(或当前翻译单元中的任何函数)调用一个名为 function 的函数,您应该包含一个 header 声明 function,但您不需要包含 [=16] =] 定义 function 的翻译单元包括在内,除非您也使用它们。

#include "function.h" 
//^ this should be "-quoted not <-quoted because it's not a system header
//int funtion(void); //this declaration is redundant
//#include <stdio.h> isn't needed here because you're not directly calling
//functions from stdio

int main (void)
{
     function();
     return(0);
}

根据您的示例,您应该有一个 function 的头文件,并且它应该包含在两个源文件中。你想在 function.c 中包含 function.h ,这样你就不会忘记更改头文件,如果由于某种原因你需要更改 function() 的签名,比如添加参数或更改return类型。

main.c

// Include any standard headers needed here
#include <stdio.h>
#include "function.h"

int main (void)
{
    printf("Calling function()");
    function();
    return(0);
}

function.h

#ifndef _FUNCTION_H_
#define _FUNCTION_H_

// Include only those headers that this header file needs

int function(void);

#endif

function.c

#include <stdio.h>
#include "function.h"

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

正确的做法是:

  • 每个源文件或头文件都应包含声明其使用的任何标识符的头文件。
  • 每个源文件都应该包含“它自己的”头文件,即声明源文件定义的每个外部标识符的头文件。

前者的原因是告知编译器正在使用的标识符。这为编译器提供了正确编译程序所需的信息。

后者的原因是为了确保声明与定义相匹配。通过在源文件中包含头文件,编译器在同一编译期间同时看到声明和定义,因此如果声明与定义不兼容,它会产生错误消息。

可以通过将函数的声明明确地放在使用它的源文件中而不是在头文件中来声明函数,但这是不好的做法,因为可能会出现错误由于输入错误或在一个文件中而不是在另一个文件中所做的更改。

没有必要包含声明源文件未使用的标识符的头文件,即使这些标识符已被其他文件使用。在您使用 function.c 的示例中,如果 function.c 未使用来自 <stdio.h> 的任何标识符,则它不需要包含 <stdio.h>main.c 确实使用 <stdio.h> 这一事实是无关紧要的,因为当编译器编译 function.c 时,它与 main.c.

是分开的