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頭文件不是包含頭的容器;該文件是標題。頭文件(這是一個文件)包含類型,常量,變量和函數原型;它不包含標題,儘管它可能包含其他標題。 –