请原谅我,如果这听起来是一个多次被问过的问题,但我向你保证这有点不同。
我使用Codeblocks进行C编程,最近我开始想知道为什么有人会在C中使用头文件。我理解它用于声明和/或定义变量结构。但这是我尝试过的东西,现在我很困惑。
我有一个名为
的头文件test1.h
#ifndef TEST1_H_INCLUDED
#define TEST1_H_INCLUDED
static int testvar = 233;
extern int one;
extern void show();
#endif // TEST1_H_INCLUDED
和另外两个文件
headertest.c
#include"test1.h"
#include<stdio.h>
int one = 232;
int main()
{
testvar = 12;
printf("The address of one is %p and value is %d",&testvar,testvar);
printf("value of one is %d",one);
show();
return 0;
}
headertest2.c
#include "test1.h"
#include<stdio.h>
extern int one;
extern void show()
{
//extern int one;
testvar = 34;
printf("\nThe address of one is %p and value is %d",&testvar, testvar);
printf("The value of one is %d", one);
}
现在我的观点是,即使我发表声明 extern int one; extern void show(); 从头文件test1.h我在编译和执行期间没有得到任何警告或错误。当我可以直接访问int one和来自headertest.c的void show(),因为它们隐式具有外部链接,那么在这里使用Header文件是什么?为什么有人会在头文件中声明某个变量或函数为extern,否则可以直接访问!!
谢谢
答案 0 :(得分:12)
使用头文件,这样您就不会重复了。在您的示例中,您不需要编写
extern int one;
<{1>}中的,因为它已经通过头文件包含在该文件中。
不重复自己不是一件小事。想象一下,你有一百个使用这个全局变量的文件(headertest2.c
)。您想在所有中写下one
吗?如果有20个这样的变量和50个以上的函数怎么办?如果您想将extern int one
更改为int
当然,重复定义很繁琐且容易出错。
让我们看一下uint32_t
。如果没有标题,则必须在每个想要执行I / O的文件中复制粘贴以下代码:
stdio.h
那,这就是我们有头文件的原因。
答案 1 :(得分:3)
在标题中提供函数声明将至少保护您免受诸如传递不兼容类型的参数之类的愚蠢错误。
此外,标头不仅用于函数声明。什么是struct
/ enum
定义,全局typedef
,宏,内联函数等?
最后,标头可以被视为模块的外部API。人们可以简单地看看标题,以了解如何使用它而不处理实现(有时根本不可用)。
答案 2 :(得分:1)
C头文件是一种共享全局指针,宏(#define ...),声明为未实现结构或typedef的常见结构类型的方法。头文件的最大用途之一是在C模块之间共享函数声明。