青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Chip Studio

常用鏈接

統計

最新評論

關于C/C++語言中頭文件的使用的一些看法

一、  只有一個文件的情況

先來看一下比較簡單的情形,也就是只有一個文件的時候,一個程序是什么樣子的。

//main.c

#include <stdio.h>

 

int main(int argc, char** args)

{

    printf("Hello\n") ;

    return 0 ;

}

這個時候程序一目了然,我們很容易就可以看出它說了什么。

 

二、  多個源代碼文件的情況

但是,隨著我們要編寫的程序的規模不斷擴大,我們不得不把一個源代碼文件拆分開,把具有一定功能的某些方法放到其它單獨的源碼文件中。比如像下面這樣:

//main.c

#include <stdio.h>

 

int main(int argc, char** args)

{

    sayhello() ;

    return 0 ;

}

 

//sayhello.c

#include <stdio.h>

int sayhello()

{

    printf("Hello\n") ;

}

把功能放在了sayhello.c文件中,而main.c只放主函數的代碼。這樣看起來更加的清晰明快。雖然形式上分成多個文件,但編譯器在編譯的時候會自動把它們連在一起,也就是說它們還是相當于在一個大文件中寫代碼。但是如果我們啟圖分別編譯這兩個文件,然后再鏈接成一個可執行程序的時候,就會發生錯誤。原因在于main.c中使用了一個函數sayhello,這時編譯器并不知道sayhello是什么,因為相對于main.c來說,它并不存在sayhello的定義和實現。所以,我們必須要在main.c中加入sayhello的聲明(只要聲明就夠了,不必再實現一次)。方法是加一句int sayhello() ;但問題是,當我們的工程越來越大的時候,我們總不能引用一個函數就寫一下它的都聲明吧?

三、  引入頭文件

這時最好的解決辦法就是引用頭文件。就是編寫一個與sayhello.c同名的文件sayhello.h,用于定義常量、結構,聲明函數等。具體的做法如下:

//main.c

#include <stdio.h>

#include "sayhello.h"

 

int main(int argc, char** args)

{

    sayhello() ;

    return 0 ;

}

 

//sayhello.c

#include <stdio.h>

#include "sayhello.h"

int sayhello()

{

    printf("Hello\n") ;

}

 

//sayhello.h

int sayhello() ;

 

四、  說說include

對于頭文件,我們應僅把它看作是一個文本文件,它跟程序的代碼文件(即擴展名為.c的文件)并不一樣。編譯器在編譯的過程中,只會處理代碼文件,而不會去管其它的頭文件。只有當我們在頭文件中使用#include的時候,相應的頭文件才會被包含進來。編譯器只是在編譯前把#include所在的位置換成了相應頭文件中的內容罷了。

使用<>括起來的是系統的默認庫文件,也就是說不用咱們自己去找這個文件所在的位置,只寫一個名字,編譯器就自動找到庫目錄中的文件了。而””括起來的正好相反,大多是我們自己編的代碼或引用的非標準C的庫文件,它要求給出文件所在的絕對地址或相對地址。比如說,如果你的庫目錄設成/usr/share/include,那么下面的寫法是等價的:

#include <stdio.h> == #include “/usr/share/include/stdio.h”

 

五、  談談頭文件具體的使用

道理都懂了,那么自己寫程序時,我的頭文件到底應該怎么寫呢?其實,頭文件的寫法很隨意,很多人都有自己的使用習慣。但是我自己的看法是,盡量模仿標準C的庫。現在就來研究一下吧。

比如我們平時使用printf時,我們都要包括一個頭文件,即stdio.h。它的特點是我在哪個代碼文件用到了這個庫中的函數,我就在哪個代碼文件中包括它的頭文件;包含它后,我的代碼中不應該引入錯誤,引用的庫函數不應該因為代碼文件中多引用了或少引用了一些其它的頭文件而出錯。

為了達到這個目標,我的做法是:每寫一個代碼文件,就寫一個對應的頭文件;把所有的聲明、定義、結構體、常量、宏放在頭文件中,而代碼實現絕對不放在頭文件中;對頭文件的抱含也放到頭文件中,代碼文件中不含include宏。

下面看一些反例:

反例1:

//types.h

typedef int status ;

 

//sayhello.h

status sayhello() ;

 

//sayhello.c

#include <stdio.h>

#include "types.h"

#include "sayhello.h"

 

status sayhello()

{

    printf("Hello!\n") ;

    return 0 ;

}

 

//main.c

#include "sayhello.h"

 

int main(int argc, char** argv)

{

    sayhello() ;

    return 0 ;

}

sayhello的定義中,出現了一個自定義類型status,它的聲明包括在types.h文件中。放對它的引用放在了sayhello.c中,這樣單獨編譯sayhello.c沒有任何問題。可是當編譯到main.c的時候,就出現問題了,編譯報錯:找不到status的聲明。這是因為在main.c中只抱括了sayhello.h,而它的聲明又需要types.h。所以,它出現了由于少引用types.h而發生的錯誤。所以,我強調把所有的include都放到頭文件中去。如果這樣寫則不會出問題。

//sayhello.h

#include <stdio.h>

#include "types.h"

 

status sayhello() ;

 

//sayhello.c

#include "sayhello.h"

 

status sayhello()

{

    printf("Hello!\n") ;

    return 0 ;

}

//main.c

#include "sayhello.h"

 

int main(int argc, char** argv)

{

    sayhello() ;

    return 0 ;

}

這樣就符合了前面提到的原則。不過,我還可以做如下的改動:

//main.c

#include "sayhello.h"

#include "types.h"

 

int main(int argc, char** argv)

{

    status s = sayhello() ;

    return 0 ;

}

在主程序中聲明了status類型的變量s。根據上面的原則,哪里引用了它,哪里就包括它的頭文件,所以我們包括了types.h頭文件。有人會說:“沒有types.h,也一樣不會出錯啊,在sayhello.h中不是引用過types.h嗎?”這樣做真的是多此一舉嗎?當然不是,我覺得它是相當有意義的。第一,它維護了我們自己定下的原則。保持一個不變的代碼習慣是很有好處的。第二,由于我們保證了頭文件中不加入實現性質的代碼,只寫些聲明類的代碼,它們在編譯時只是起來語法制導的作用,并不會被成為目標程序的一部分,所以這樣寫并不會造成浪費。這也是提倡頭文件中不要夾雜代碼的一個原因。

如果真的不想把頭文件編譯多次的話,還有一個辦法,如下:

#ifndef _HEADER_FILE_

#define _HEADER_FILE_

//聲明部分

//...........

#endif

這樣寫可以保證編譯器只編譯一次,其中的_HEADER_FILE_自己定義的頭文件的唯一標識,只要別跟常量定義和別的頭文件沖突,您喜歡叫它什么就叫它什么吧。^^

 

六、  總結

最后總結一下吧。如果當你在編寫自己龐大的代碼文件群的時候,遇到了一些猶豫,就想想上面的原則和應用。當因為頭文件編譯出錯的時候,考慮一下是否自己有哪些動作違反了上面的原則。只要經常思考,每個人都會總結是適合自己的使用習慣,盡量減少在這些程序員看來無關緊要的事情上出錯的機會。以上只是本人自己使用習慣的一次總結,不代表任何規范和標準,歡迎善意的批評指正.^_^

posted on 2008-02-26 14:04 MyChip 閱讀(2959) 評論(0)  編輯 收藏 引用 所屬分類: C/C++/CLI

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            夜夜嗨av一区二区三区四区| 欧美大片一区二区| 男女精品网站| 欧美福利视频| 亚洲国产精品久久久| 美女精品在线观看| 亚洲激情黄色| 亚洲综合国产精品| 久久久久久久高潮| 欧美经典一区二区三区| 欧美色播在线播放| 国产夜色精品一区二区av| 亚洲第一区在线观看| 亚洲乱亚洲高清| 亚洲欧美成人一区二区在线电影| 欧美亚洲自偷自偷| 免费日韩成人| a91a精品视频在线观看| 久久精品盗摄| 欧美三级网址| 在线看无码的免费网站| 亚洲午夜精品视频| 久久男人资源视频| av成人免费观看| 久久久一区二区三区| 欧美三区在线视频| 亚洲第一在线| 久久成人av少妇免费| 欧美国产日韩免费| 欧美亚洲一区三区| 欧美日韩在线播| 亚洲激情偷拍| 久久精品免视看| 亚洲色图自拍| 欧美成人免费网| 国内精品视频在线观看| 亚洲欧美日韩国产成人| 亚洲国产老妈| 久久亚洲私人国产精品va媚药| 欧美日韩一区在线播放| 亚洲七七久久综合桃花剧情介绍| 久久久成人网| 在线一区亚洲| 亚洲电影自拍| 久久久亚洲国产天美传媒修理工| 国产精品久久久久一区二区三区共 | 性欧美xxxx视频在线观看| 久久夜色精品亚洲噜噜国产mv| 日韩午夜激情av| 亚洲视频狠狠| 免费一级欧美片在线播放| 亚洲欧美日韩精品久久奇米色影视 | 国产精品丝袜xxxxxxx| 久久久水蜜桃av免费网站| 国产日韩欧美不卡在线| 欧美专区中文字幕| 性18欧美另类| 国产在线精品一区二区中文| 久久精品欧美日韩| 久久riav二区三区| 国内久久精品| 麻豆精品精华液| 久久免费偷拍视频| 亚洲成色777777女色窝| 欧美成人首页| 欧美日本精品在线| 亚洲天堂av电影| 亚洲欧美另类综合偷拍| 国产一区av在线| 欧美激情性爽国产精品17p| 欧美另类高清视频在线| 亚洲一区欧美激情| 午夜精品久久久久久久久久久久| 国产日韩视频一区二区三区| 六月丁香综合| 欧美日本成人| 欧美综合激情网| 蜜臀a∨国产成人精品| 9i看片成人免费高清| 亚洲一区二区在线观看视频| 国产一区二区三区四区五区美女| 狼人社综合社区| 欧美成人性网| 亚洲欧美日韩第一区| 久久久久国产精品人| 日韩视频中文| 欧美综合国产| 在线亚洲免费| 久久精品国产96久久久香蕉| 亚洲精品婷婷| 午夜精品久久一牛影视| 91久久亚洲| 欧美一级久久久| 亚洲最黄网站| 久久久国产精品一区二区三区| 日韩亚洲成人av在线| 午夜精品久久久久久久男人的天堂| 在线观看成人一级片| 亚洲夜间福利| 亚洲精品永久免费| 久久国产精品一区二区三区| 日韩性生活视频| 久久久噜噜噜久噜久久| 亚洲综合色在线| 欧美18av| 久久―日本道色综合久久| 亚洲二区在线视频| 亚洲欧美综合精品久久成人| 亚洲美女在线一区| 久久岛国电影| 亚洲在线成人| 欧美精品在线免费播放| 开心色5月久久精品| 国产欧美精品一区二区三区介绍| 亚洲欧洲三级电影| 亚洲电影在线免费观看| 午夜一级久久| 欧美在线1区| 欧美视频一区在线| 亚洲韩国精品一区| 最近看过的日韩成人| 久久久91精品国产| 久久久人人人| 国产尤物精品| 欧美亚洲视频在线观看| 欧美一级大片在线免费观看| 欧美亚州在线观看| 中国女人久久久| 亚洲欧美在线aaa| 国产精品一国产精品k频道56| 亚洲精品资源| 亚洲一区二区三区国产| 国产精品大片免费观看| 亚洲图片欧美一区| 欧美一区91| 国产在线欧美日韩| 久久爱另类一区二区小说| 久久精品一区二区国产| 国语自产偷拍精品视频偷| 欧美一级理论片| 免费视频一区| 亚洲精品偷拍| 欧美日韩一区二区免费在线观看| 亚洲日本免费| 亚洲午夜一区| 国产欧美日韩一区二区三区在线| 亚洲女ⅴideoshd黑人| 久久国产乱子精品免费女 | 国产精品久久久久久久午夜| 这里只有精品电影| 欧美中文字幕视频| 一色屋精品亚洲香蕉网站| 久久久久国产成人精品亚洲午夜| 免费观看久久久4p| 亚洲伦理网站| 国产精品美女久久| 午夜日韩在线观看| 免费观看30秒视频久久| 91久久黄色| 欧美午夜精品理论片a级按摩 | 亚洲国产美国国产综合一区二区| 久久最新视频| 在线一区亚洲| 老司机aⅴ在线精品导航| 亚洲人成网站999久久久综合| 欧美日韩美女在线观看| 午夜在线精品偷拍| 亚洲第一二三四五区| 亚洲一区在线观看视频| 国产一区二区三区高清播放| 免费成人黄色片| 欧美高清在线一区| 欧美一级淫片aaaaaaa视频| 美玉足脚交一区二区三区图片| 亚洲国产精品黑人久久久| 欧美日韩午夜在线| 久久久夜夜夜| 亚洲一区二区三区免费观看| 欧美sm视频| 欧美一区二区三区精品电影| 亚洲高清色综合| 国产麻豆日韩| 欧美视频手机在线| 美女性感视频久久久| 亚洲欧美日本国产专区一区| 亚洲高清资源| 久久―日本道色综合久久| 亚洲永久网站| 日韩一二在线观看| 亚洲国产aⅴ天堂久久| 国产日韩精品一区二区三区| 欧美日韩日本视频| 欧美高清视频一二三区| 久久噜噜噜精品国产亚洲综合| 亚洲一区二区三区在线| 99精品视频网| 99在线|亚洲一区二区| 亚洲国产日韩欧美| 欧美福利视频在线| 久久一二三国产|