2016-08-14 75 views
1

我需要知道C语言中的“Header”是什么意思?它是:什么是C语言头文件?

  • 代码中的区域,如HTML代码中的标题区域(标题>或声明区域或定义区域或类型)?
  • 或者它就像一个可以调用的函数(可以是:函数,子例程或范围或种类)。
+1

我不完全确定你在这里寻找什么样的答案。 “头文件”实际上并不是C语言中的一个正式的语言层次的概念,它只是关于如何使用'#include'的惯例。你在问那个约定是什么,或者#include是什么? –

+0

只是一堆编译器的定义(指令),通常在'h'文件中声明。除非您明确声明变量或在该头文件中实现一个函数(这在概念上是错误的,应该避免),否则代码中的任何区域都不会生成这些指令。 –

+0

@barakmanos:你也可以在头文件中有内联函数或宏。 –

回答

0

标头是扩展名为.h的文件。 它旨在帮助编译器理解代码中使用的符号(方法,函数,结构,变量...)。在书的最后看到它就像一个词汇表。 它仅用于开发目的。 它帮助develloper知道什么功能可用,而无需查看所有的实现文件。就像一个手册页。

在谷歌搜索? http://www.tutorialspoint.com/cprogramming/c_header_files.htm :)

+0

“*它不是编译的,不在发布二进制文件中,仅用于开发目的。*”好吧,不。 – alk

+0

@alk:小心纠正我?如果你能解释一下自己,我会很乐意纠正我的答案。 –

+0

尽管*概念*标头不会带有实现,它们是编译过程中非常好的一部分。他们的“内容”不一定会在生产中缺乏。 – alk

0

通常当在C中谈论“标题”时,含义是the #include preprocessor directive包含的文件。这些被称为头文件文件。

它也可能是其他的东西,如源头顶部的注释(或头文件文件)可能是头。函数之前的注释可以是函数头。

或者当通过互联网读取数据文件或数据时,许多协议将数据拆分为标题和实际数据(例如见HTTP)。

1

什么是C标题语言学?

参照语言我说C头文件描述接口通过一个翻译单元,即伴随C文件提供。

接口” 由

  • 类型的手段
  • 常数
  • (全局)变量
  • 功能

不是所有的上述需要成为其中的一部分一个C头。

从C语言的角度来看,C头文件是可选的,但按照惯例,它们预计会存在。

+0

谢谢..但我需要“标题”只有头文件..看,当我们说的源代码,我们的意思是执行程序的语言,所以源文件是包含源代码的容器。现在我需要知道“Header”,那么头文件是一个包含“header”的容器。 –

2

标题是C程序员普遍接受的约定。

这是一个通常包含在C源文件中的.h文件,它提供了几个优点。

1.-提供数据类型,全局变量,常量和函数的声明。

因此,您不必一次又一次地重写它们。如果他们需要改变,你只需要在一个文件中改变它。

在这个例子中,由两个compliation单位(两个.c文件)组成的程序编译并运行得很好。

// File funcs.c 
#include <stdio.h> 
struct Position { 
    int x; 
    int y; 
}; 

void print(struct Position p) { 
    printf("%d,%d\n", p.x, p.y); 
} 

// File main.c 
struct Position { 
    int x; 
    int y; 
}; 

int main(void) { 
    struct Position p; 
    p.x = 1; p.y = 2; 
    print(p); 
} 

但更mantainable有对struct Position声明在头文件,只是#include它无处不在,它是必要的,就像这样:

// File funcs.h 
#ifndef FUNCS_H 
#define FUNCS_H 
struct Position { 
    int x; 
    int y; 
}; 
#endif // FUNCS_H 

//File funcs.c 
#include <stdio.h> 
#include "funcs.h" 

void print(struct Position p) { 
    printf("%d,%d\n", p.x, p.y); 
} 

//File main.c 
#include "funcs.h" 
int main(void) { 
    struct Position p; 
    p.x = 1; p.y = 2; 
    print(p); 

2:提供某种类型的安全。

C功能implicit declaration of functions。一个在C99中修复的“特征”(或者说是一种可论证的语言设计错误)。

考虑一下这个程序的两个.c文件组成:

//File funcs.c 
#include<stdio.h> 
int f(long n) 
{ 
    n = n+1; 
    printf("%ld\n", n); 
} 

// File main.c 
int main(void) 
{ 
    f("a"); 
    return 0; 
} 

与海湾合作委员会这个程序编译没有警告或错误。但不表现为,我们可以合理的期待和渴望:

[email protected] ~/t/tt $ gcc -o test *.c 
[email protected] ~/t/tt $ ./test 
4195930 

使用头文件是这样的:

//File funcs.h 
#ifndef FUNCS_H 
#define FUNCS_H 
int f(long n); 
#endif // FUNCS_H 

//File funcs.c 
#include<stdio.h> 
int f(long n) { 
    n = n+1; 
    printf("%ld\n", n); 
} 

// File main.c 
#include"funcs.h" 
int main(void) { 
    f("a"); 
    return 0; 
} 

程序仍然编译和工程错误的,但至少我们得到一个警告:

[email protected] ~/t $ gcc -o test *.c 
main.c: In function 'main': 
main.c:5:5: warning: passing argument 1 of 'f' makes integer from pointer without a cast 
    f("a"); 
    ^
In file included from main.c:2:0: 
funcs.h:3:5: note: expected 'long int' but argument is of type 'char *' 
int f(long n); 
    ^
[email protected] ~/t $ ./test 
4195930 

3.-提供一个公共接口,同时让实现细节保持隐藏状态。

当你设计你的程序时,最好使它成为模块化。这是为了确保它的不同部分(模块)尽可能地独立。所以,当你需要改变一个模块时,你不必担心影响其他模块的这种改变

头部有助于做到这一点,因为你在模块头部放置了数据结构,函数原型和常量这种模块的用户将会需要它。

实现细节进入.c文件。

这就是图书馆的工作方式。 API接口被指定并分布在头文件中。但API代码在.c文件中,不需要分发。作为库的用户,您只需要头文件和编译后的库,而不是源代码。

+0

1+不只是提及“* interface *”。 :-) – alk

+0

谢谢..但我只需要“Header”而不是头文件..看,当我们说源代码时,我们指的是执行程序的语言行,因此源文件是包含源代码的容器。现在我需要知道“Header”,那么头文件是一个包含“header”的容器。我需要明白这一点。 –

+1

在编码约定下,我遵循所有的C头文件是C头文件,而所有的C头文件都是C头文件。因此,在这样的约定下,C头文件不是包含头的容器;该文件是标题。头文件(这是一个文件)包含类型,常量,变量和函数原型;它不包含标题,尽管它可能包含其他标题。 –