2016-12-04 72 views
2

我剛開始C,我不太熟悉它是如何工作的。 我有一個文件stud.h:C:如何從庫中訪問數據類型

struct stud{}; 
void inc_stud_pos(){}; 
int get_stud_pos(){}; 

和stud.c:

#include "stud" 

#define STUDENT_SIZE 20 

struct stud{ 
    char stud_id[MAX_STR_LEN]; 
    char stud_name[MAX_STR_LEN]; 
    struct grade Grade[MAX_STRUCT]; 
    struct income Income[MAX_STRUCT]; 
}; 

int stud_location = 0; 

struct stud students[STUDENT_SIZE]; 

void inc_stud_pos(){ 
    stud_location++; 
} 

int get_stud_pos(){ 
    return stud_location; 
} 

,現在我從另一個文件要訪問一些內部stud.c.功能 可以說我想在另一個文件中使用STUDENT_SIZE什麼是語法? 我需要使用stud.STUDENT_SIZE嗎?或者當我包含「stud」時,我可以訪問學生大小? 如果我想要讓說讓學生組成的數組:

struct stud students[STUDENT_SIZE]; 

我可以訪問,通常像學生[5] .stud_id?

謝謝!

+0

爲什麼在頭文件中有定義(空定義'{}')? – e0k

回答

2

頭文件(.h)是程序員與您模塊的接口。你的模塊的用戶(程序員)需要知道的使用你的模塊應該在那裏,但把實際的實現放在相關的.c文件中。通常,您將函數原型(例如int f(void);)放入.h文件中,並將.c文件中的定義(實現,例如int f(void) { return 1; })放入文件中。鏈接器將原型匹配到定義,因爲函數簽名匹配(名稱,參數類型和返回類型)。想一想的一種方法是將.h文件作爲您與所有人共享的文件,並將.c文件作爲您自己保存的文件。

如果你希望你的模塊的用戶不得不STUDENT_SIZE訪問,然後把

#define STUDENT_SIZE 20 

.h文件,而不是你的.c文件。然後,任何文件與

#include "stud.h" 

將有您的宏爲STUDENT_SIZE。 (注意:文件名是"stud.h""stud"。)

可以說,我想在另一個文件中使用STUDENT_SIZE什麼語法?我需要使用stud.STUDENT_SIZE嗎?

不可以,你可能會命名空間,這C does not have在同樣的意義像C++,Java等其他語言只需使用STUDENT_SIZE會混淆這一點。 (這就是爲什麼不使用現有的標識符很重要,也是爲什麼許多人對宏不滿。)

...我想從另一個文件訪問stud.c中的一些功能。

如果想要另一個文件才能訪問到stud.c一些功能,然後把這個函數的原型stud.h。這正是頭文件的用途。

...如果我想要讓說讓學生組成的數組:

struct stud students[STUDENT_SIZE];

我可以訪問,通常像students[5].stud_id

正如你寫你的頭文件,沒有。您可能知道有一些struct stud存在,但您不知道這些成員的名稱(即您不知道stud_id存在)。原因是你的模塊的用戶只能看到頭文件中的內容,並且你沒有在頭文件中定義結構的成員。 (我很驚訝你所寫甚至編譯,因爲你定義struct stud兩次,一次空{},一旦有成員。)同樣,如果你想程序員用戶有權訪問的struct stud成員,其定義

struct stud { 
    char stud_id[MAX_STR_LEN]; 
    char stud_name[MAX_STR_LEN]; 
    struct grade Grade[MAX_STRUCT]; 
    struct income Income[MAX_STRUCT]; 
}; 

屬於你的頭文件(以及其他的宏)。不知道這一點,程序員(和編譯器)不知道struct stud的成員是什麼。

(在你沒有問這個,但如果你想在你的.c文件共享訪問全局變量,然後.h文件中聲明它用關鍵字extern,沒有extern.c文件,請參閱How to correctly use the extern keyword in C瞭解更多信息。)

+0

非常感謝,這正是我需要知道的。我習慣了Java和C,就像我在石頭上雕刻一樣,我非常努力地去做這個盲目的事情。但現在一切都很清楚,非常感謝。 – Kan

1

您無法訪問STUDENT_SIZE以及如何寫入頭文件。頭文件橋樑和擴展了上述項目的範圍:

struct stud{}; //this should be fixed btw 
void inc_stud_pos(); 
int get_stud_pos(); 

如果你想,而不是延長STUDENT_SIZE範圍,然後在.c文件中聲明它的把它放在.h文件。但是,如果您這樣做,則必須刪除.c文件中聲明STUDENT_SIZE的代碼行。