.h 和 .c 文件的理解

  • 簡(jiǎn)單的說(shuō)其實(shí)要理解C文件與頭文件(即.h)有什么不同之處擦俐,首先需要弄明白編譯器的工作過(guò)程,一般說(shuō)來(lái)編譯器會(huì)做以下幾個(gè)過(guò)程:


    Compiler

1.預(yù)處理階段
2.詞法與語(yǔ)法分析階段
3.編譯階段疫粥,首先編譯成純匯編語(yǔ)句,再將之匯編成跟CPU相關(guān)的二進(jìn)制碼秩伞,生成各個(gè)目標(biāo)文件 (.obj文件)
4.連接階段延欠,將各個(gè)目標(biāo)文件中的各段代碼進(jìn)行絕對(duì)地址定位,生成跟特定平臺(tái)相關(guān)的可執(zhí)行文件铡原,當(dāng)然偷厦,最后還可以用objcopy生成純二進(jìn)制碼,也就是去掉了文件格式信息燕刻。(生成.exe文件)

Compiler

編譯器在編譯時(shí)是以C文件為單位進(jìn)行的只泼,也就是說(shuō)如果你的項(xiàng)目中一個(gè)C文件都沒(méi)有,那么你的項(xiàng)目將無(wú)法編譯卵洗,連接器是以目標(biāo)文件為單位请唱,它將一個(gè)或多個(gè)目標(biāo)文件進(jìn)行函數(shù)與變量的重定位,生成最終的可執(zhí)行文件过蹂,在PC上的程序開(kāi)發(fā)十绑,一般都有一個(gè)main函數(shù),這是各個(gè)編譯器的約定榴啸,當(dāng)然孽惰,你如果自己寫(xiě)連接器腳本的話,可以不用main函數(shù)作為程序入口E赣 QΑ!库说!
(main .c文件 目標(biāo)文件 可執(zhí)行文件)

有了這些基礎(chǔ)知識(shí)狂鞋,再言歸正傳,為了生成一個(gè)最終的可執(zhí)行文件潜的,就需要一些目標(biāo)文件骚揍,也就是需要C文件,而這些C文件中又需要一個(gè)main函數(shù)作為可執(zhí)行程序的入口,那么我們就從一個(gè)C文件入手信不,假定這個(gè)C文件內(nèi)容如下:

    #include <stdio.h>
  #include "mytest.h"
  int main(int argc,char **argv)
  {
    test = 25;
    printf("test.................%d ",test);
  }

mytest.h 中的內(nèi)容如下:

int test;

舉個(gè)栗子??講解下編譯器的工作:

1.預(yù)處理階段

編譯器以C文件作為一個(gè)單元嘲叔,首先讀這個(gè)C文件,發(fā)現(xiàn)第一句與第二句是包含一個(gè)頭文件抽活,就會(huì)在所有搜索路徑中尋找這兩個(gè)文件硫戈,找到之后,就會(huì)將相應(yīng)頭文件中再去處理宏下硕,變量丁逝,函數(shù)聲明,嵌套的頭文件包含等梭姓,檢測(cè)依賴關(guān)系霜幼,進(jìn)行宏替換,看是否有重復(fù)定義與聲明的情況發(fā)生誉尖,最后將那些文件中所有的東東全部掃描進(jìn)這個(gè)當(dāng)前的C文件中罪既,形成一個(gè)中間"C文件"。

2.編譯階段

在上一步中相當(dāng)于將那個(gè)頭文件中的test變量掃描進(jìn)了一個(gè)中間C文件释牺,那么test變量就變成了這個(gè)文件中的一個(gè)全局變量萝衩,此時(shí)就將所有這個(gè)中間C文件的所有變量,函數(shù)分配空間没咙,將各個(gè)函數(shù)編譯成二進(jìn)制碼,按照特定目標(biāo)文件格式生成目標(biāo)文件千劈,在這種格式的目標(biāo)文件中進(jìn)行各個(gè)全局變量祭刚,函數(shù)的符號(hào)描述,將這些二進(jìn)制碼按照一定的標(biāo)準(zhǔn)組織成一個(gè)目標(biāo)文件墙牌。

3.連接階段

將上一步成生的各個(gè)目標(biāo)文件涡驮,根據(jù)一些參數(shù),連接生成最終的可執(zhí)行文件喜滨,主要的工作就是重定位各個(gè)目標(biāo)文件的函數(shù)捉捅,變量等,相當(dāng)于將個(gè)目標(biāo)文件中的二進(jìn)制碼按一定的規(guī)范合到一個(gè)文件中再回到C文件與頭文件各寫(xiě)什么內(nèi)容的話題上:理論上來(lái)說(shuō)C文件與頭文件里的內(nèi)容虽风,只要是C語(yǔ)言所支持的棒口,無(wú)論寫(xiě)什么都可以的,比如你在頭文件中寫(xiě)函數(shù)體辜膝,只要在任何一個(gè)C文件包含此頭文件就可以將這個(gè)函數(shù)編譯成目標(biāo)文件的一部分(編譯是以C文件為單位的无牵,如果不在任何C文件中包含此頭文件的話,這段代碼就形同虛設(shè))厂抖,你可以在C文件中進(jìn)行函數(shù)聲明茎毁,變量聲明,結(jié)構(gòu)體聲明忱辅,這也不成問(wèn)題F咧L犯取!

  • 那為何一定要分成頭文件與C文件呢橡卤?又為何一般都在頭件中進(jìn)行函數(shù)扮念,變量聲明,宏聲明蒜魄,結(jié)構(gòu)體聲明呢扔亥?而在C文件中去進(jìn)行變量定義,函數(shù)實(shí)現(xiàn)呢谈为?旅挤?原因如下:

1.如果在頭文件中實(shí)現(xiàn)一個(gè)函數(shù)體,那么如果在多個(gè)C文件中引用它伞鲫,而且又同時(shí)編譯多個(gè)C文件粘茄,將其生成的目標(biāo)文件連接成一個(gè)可執(zhí)行文件,在每個(gè)引用此頭文件的C文件所生成的目標(biāo)文件中秕脓,都有一份這個(gè)函數(shù)的代碼柒瓣,如果這段函數(shù)又沒(méi)有定義成局部函數(shù),那么在連接時(shí)吠架,就會(huì)發(fā)現(xiàn)多個(gè)相同的函數(shù)芙贫,就會(huì)報(bào)錯(cuò)。

2.如果在頭文件中定義全局變量傍药,并且將此全局變量賦初值磺平,那么在多個(gè)引用此頭文件的C文件中同樣存在相同變量名的拷貝,關(guān)鍵是此變量被賦了初值拐辽,所以編譯器就會(huì)將此變量放入DATA段拣挪,最終在連接階段,會(huì)在DATA段中存在多個(gè)相同的變量俱诸,它無(wú)法將這些變量統(tǒng)一成一個(gè)變量菠劝,也就是僅為此變量分配一個(gè)空間,而不是多份空間睁搭,假定這個(gè)變量在頭文件沒(méi)有賦初值赶诊,編譯器就會(huì)將之放入BSS段,連接器會(huì)對(duì)BSS段的多個(gè)同名變量?jī)H分配一個(gè)存儲(chǔ)空間介袜。

3.如果在C文件中聲明宏甫何,結(jié)構(gòu)體,函數(shù)等遇伞,那么我要在另一個(gè)C文件中引用相應(yīng)的宏辙喂,結(jié)構(gòu)體,就必須再做一次重復(fù)的工作,如果我改了一個(gè)C文件中的一個(gè)聲明巍耗,那么又忘了改其它C文件中的聲明秋麸,這不就出了大問(wèn)題了,程序的邏輯就變成了你不可想象的了炬太,如果把這些公共的東東放在一個(gè)頭文件中灸蟆,想用它的C文件就只需要引用一個(gè)就OK了!G鬃濉炒考!這樣豈不方便,要改某個(gè)聲明的時(shí)候霎迫,只需要?jiǎng)右幌骂^文件就行了斋枢。

4.在頭文件中聲明結(jié)構(gòu)體,函數(shù)等知给,當(dāng)你需要將你的代碼封裝成一個(gè)庫(kù)瓤帚,讓別人來(lái)用你的代碼,你又不想公布源碼涩赢,那么人家如何利用你的庫(kù)呢戈次?也就是如何利用你的庫(kù)中的各個(gè)函數(shù)呢?筒扒?一種方法是公布源碼怯邪,別人想怎么用就怎么用,另一種是提供頭文件花墩,別人從頭文件中看你的函數(shù)原型擎颖,這樣人家才知道如何調(diào)用你寫(xiě)的函數(shù),就如同你調(diào)用printf函數(shù)一樣观游,里面的參數(shù)是怎樣的?驮俗?你是怎么知道的懂缕??還不是看人家的頭文件中的相關(guān)聲明巴醮铡L赂獭?骼赔嚎!當(dāng)然這些東東都成了C標(biāo)準(zhǔn)秸仙,就算不看人家的頭文件拜鹤,你一樣可以知道怎么使用阎毅。

c++中 .c 和 .h 的困惑

本質(zhì)上沒(méi)有任何區(qū)別赫编。 只不過(guò)一般:

  • .h文件是頭文件尽纽,內(nèi)含函數(shù)聲明畅蹂、宏定義、結(jié)構(gòu)體定義等內(nèi)容旬迹;
  • .c文件是程序文件火惊,內(nèi)含函數(shù)實(shí)現(xiàn),變量定義等內(nèi)容奔垦;

文件是什么后綴也沒(méi)有關(guān)系屹耐,只不過(guò)編譯器會(huì)默認(rèn)對(duì)某些后綴的文件采取某些動(dòng)作。你可以強(qiáng)制編譯器把任何后綴的文件都當(dāng)作c文件來(lái)編椿猎。

在aaa.h里定義了一個(gè)函數(shù)的聲明惶岭,然后aaa.h的同一個(gè)目錄下建立aaa.c,aaa.c里定義了這個(gè)函數(shù)的實(shí)現(xiàn)犯眠,然后是在main函數(shù)所在.c文件里#include這個(gè)aaa.h 然后我就可以使用這個(gè)函數(shù)了按灶。main在運(yùn)行時(shí)就會(huì)找到這個(gè)定義了這個(gè)函數(shù)的aaa.c文件。

這樣分開(kāi)寫(xiě)成兩個(gè)文件是一個(gè)良好的編程風(fēng)格阔逼。

而且兆衅,比方說(shuō) 我在aaa.h里定義了一個(gè)函數(shù)的聲明,然后我在aaa.h的同一個(gè)目錄下建立aaa.c嗜浮,aaa.c里定義了這個(gè)函數(shù)的實(shí)現(xiàn)羡亩,然后是在main函數(shù)所在.c文件里#include這個(gè)aaa.h 然后我就可以使用這個(gè)函數(shù)了。main在運(yùn)行時(shí)就會(huì)找到這個(gè)定義了這個(gè)函數(shù)的aaa.c文件危融。

main函數(shù)為標(biāo)準(zhǔn)C/C++的程序入口畏铆,編譯器會(huì)先找到該函數(shù)所在的文件。
假定編譯程序編譯myproj.c(其中含main())時(shí)吉殃,發(fā)現(xiàn)它include了mylib.h(其中聲明了函數(shù)void test())辞居,那么此時(shí)編譯器將按照事先設(shè)定的路徑(Include路徑列表及代碼文件所在的路徑)查找與之同名的實(shí)現(xiàn)文件(擴(kuò)展名為.cpp或.c,此例中為mylib.c)蛋勺,如果找到該文件瓦灶,并在其中找到該函數(shù)(此例中為void test())的實(shí)現(xiàn)代碼,則繼續(xù)編譯抱完;如果在指定目錄找不到實(shí)現(xiàn)文件贼陶,或者在該文件及后續(xù)的各include文件中未找到實(shí)現(xiàn)代碼,則返回一個(gè)編譯錯(cuò)誤.其實(shí)include的過(guò)程完全可以"看成"是一個(gè)文件拼接的過(guò)程巧娱,將聲明和實(shí)現(xiàn)分別寫(xiě)在頭文件及C文件中碉怔,或者將二者同時(shí)寫(xiě)在頭文件中,理論上沒(méi)有本質(zhì)的區(qū)別禁添。
以上是所謂動(dòng)態(tài)方式撮胧。

對(duì)于靜態(tài)方式,基本所有的C/C++編譯器都支持一種鏈接方式被稱為Static Link老翘,即所謂靜態(tài)鏈接芹啥。

在這種方式下锻离,我們所要做的,就是寫(xiě)出包含函數(shù)叁征,類等等聲明的頭文件(a.h,b.h,...)纳账,以及他們對(duì)應(yīng)的實(shí)現(xiàn)文件(a.cpp,b.cpp,...),編譯程序會(huì)將其編譯為靜態(tài)的庫(kù)文件(a.lib,b.lib,...)捺疼。在隨后的代碼重用過(guò)程中疏虫,我們只需要提供相應(yīng)的頭文件(.h)和相應(yīng)的庫(kù)文件(.lib),就可以使用過(guò)去的代碼了啤呼。

相對(duì)動(dòng)態(tài)方式而言卧秘,靜態(tài)方式的好處是實(shí)現(xiàn)代碼的隱蔽性,即C++中提倡的"接口對(duì)外官扣,實(shí)現(xiàn)代碼不可見(jiàn)"翅敌。有利于庫(kù)文件的轉(zhuǎn)發(fā)。

//a.h
void foo();
//a.c
#include "a.h"
void foo(){
   return; 
} 
//main.c 
#include "a.h" 
int main(int argc, char *argv[]) {
  foo(); 
  return 0; 
}

針對(duì)上面的代碼惕蹄,請(qǐng)回答三個(gè)問(wèn)題:

  • a.c 中的 #include "a.h" 這句話是不是多余的?
    -從C編譯器角度看蚯涮,.h和.c皆是浮云,就是改名為.txt卖陵、.doc也沒(méi)有大的分別遭顶。換句話說(shuō),就是.h和.c沒(méi)啥必然聯(lián)系泪蔫。.h中一般放的是同名.c文件中定義的變量棒旗、數(shù)組、函數(shù)的聲明撩荣,需要讓.c外部使用的聲明铣揉。這個(gè)聲明有啥用?只是讓需要用這些聲明的地方方便引用餐曹。因?yàn)?include "xx.h" 這個(gè)宏其實(shí)際意思就是把當(dāng)前這一行刪掉逛拱,把 xx.h中的內(nèi)容原封不動(dòng)的插入在當(dāng)前行的位置。由于想寫(xiě)這些函數(shù)聲明的地方非常多(每一個(gè)調(diào)用 xx.c 中函數(shù)的地方台猴,都要在使用前聲明一下子)橘券,所以用#include "xx.h" 這個(gè)宏就簡(jiǎn)化了許多行代碼--讓預(yù)處理器自己替換好了。也就是說(shuō)卿吐,xx.h 其實(shí)只是讓需要寫(xiě) xx.c中函數(shù)聲明的地方調(diào)用(可以少寫(xiě)幾行字),至于 include 這個(gè) .h 文件是誰(shuí)锋华,是 .h 還是 .c嗡官,還是與這個(gè) .h 同名的.c,都沒(méi)有任何必然關(guān)系毯焕。
    -這樣你可能會(huì)說(shuō):把苄取磺樱?那我平時(shí)只想調(diào)用 xx.c 中的某個(gè)函數(shù),卻 include了 xx.h文件婆咸,豈不是宏替換后出現(xiàn)了很多無(wú)用的聲明竹捉?沒(méi)錯(cuò),確實(shí)引入了很多垃圾尚骄,但是它卻省了你不少筆墨块差,并且整個(gè)版面也看起來(lái)清爽的多。魚(yú)與熊掌不可得兼倔丈,就是這個(gè)道理憨闰。反正多些聲明(.h一般只用來(lái)放聲明,而放不定義需五,參見(jiàn)拙著"過(guò)馬路鹉动,左右看")也無(wú)害處,又不會(huì)影響編譯宏邮,何樂(lè)而不為呢泽示?
    -翻回頭再看上面的3個(gè)問(wèn)題,很好解答了吧蜜氨?答:不一定械筛。這個(gè)例子中顯然是多余的。但是如果.c中的函數(shù)也需要調(diào)用同個(gè).c中的其它函數(shù)记劝,那么這個(gè).c往往會(huì)include同名的.h变姨,這樣就不需要為聲明和調(diào)用順序而發(fā)愁了(C語(yǔ)言要求使用之前必須聲明,而include同名.h一般會(huì)放在.c的開(kāi)頭)厌丑。有很多工程甚至把這種寫(xiě)法約定為代碼規(guī)范定欧,以規(guī)范出清晰的代碼來(lái)。
  • 為什么經(jīng)常見(jiàn) xx.c 里面 include 對(duì)應(yīng)的 xx.h怒竿?
    1)通過(guò)頭文件來(lái)調(diào)用庫(kù)功能砍鸠。在很多場(chǎng)合,源代碼不便(或不準(zhǔn))向用戶公布耕驰,只要向用戶提供頭文件和二進(jìn)制的庫(kù)即可爷辱。用戶只需要按照頭文件中的接口聲明來(lái)調(diào)用庫(kù)功能,而不必關(guān)心接口怎么實(shí)現(xiàn)的朦肘。編譯器會(huì)從庫(kù)中提取相應(yīng)的代碼饭弓。
    2)頭文件能加強(qiáng)類型安全檢查。如果某個(gè)接口被實(shí)現(xiàn)或被使用時(shí)媒抠,其方式與頭文件中的聲明不一致弟断,編譯器就會(huì)指出錯(cuò)誤,這一簡(jiǎn)單的規(guī)則能大大減輕程序員調(diào)試趴生、改錯(cuò)的負(fù)擔(dān)阀趴。
    頭文件用來(lái)存放函數(shù)原型昏翰。
  • 如果 a.c 中不寫(xiě),那么編譯器是不是會(huì)自動(dòng)把 .h 文件里面的東西跟同名的 .c 文件綁定在一起刘急?(不會(huì))
    這個(gè)問(wèn)題實(shí)際上是說(shuō)棚菊,已知頭文件"a.h"聲明了一系列函數(shù)(僅有函數(shù)原型,沒(méi)有函數(shù)實(shí)現(xiàn)),"b.cpp"中實(shí)現(xiàn)了這些函數(shù)叔汁,那么如果我想在"c.cpp"中使用"a.h"中聲明的這些在"b.cpp"中實(shí)現(xiàn)的函數(shù)统求,通常都是在"c.cpp"中使用#include "a.h",那么c.cpp是怎樣找到b.cpp中的實(shí)現(xiàn)呢?
      其實(shí).cpp和.h文件名稱沒(méi)有任何直接關(guān)系攻柠,很多編譯器都可以接受其他擴(kuò)展名球订。
      譚浩強(qiáng)老師的《C程序設(shè)計(jì)》一書(shū)中提到,編譯器預(yù)處理時(shí)瑰钮,要對(duì)#include命令進(jìn)行"文件包含處理":將headfile.h的全部?jī)?nèi)容復(fù)制到#include"headfile.h"處冒滩。這也正說(shuō)明了,為什么很多編譯器并不care到底這個(gè)文件的后綴名是什么----因?yàn)?include預(yù)處理就是完成了一個(gè)"復(fù)制并插入代碼"的工作浪谴。
    程序編譯的時(shí)候开睡,并不會(huì)去找b.cpp文件中的函數(shù)實(shí)現(xiàn),只有在link的時(shí)候才進(jìn)行這個(gè)工作苟耻。我們?cè)赽.cpp或c.cpp中用#include "a.h"實(shí)際上是引入相關(guān)聲明篇恒,使得編譯可以通過(guò),程序并不關(guān)心實(shí)現(xiàn)是在哪里凶杖,是怎么實(shí)現(xiàn)的胁艰。源文件編譯后成生了目標(biāo)文件(.o或.obj文件),目標(biāo)文件中智蝠,這些函數(shù)和變量就視作一個(gè)個(gè)符號(hào)腾么。在link的時(shí)候,需要在makefile里面說(shuō)明需要連接哪個(gè).o或.obj文件(在這里是b.cpp生成的.o或.obj文件)杈湾,此時(shí)解虱,連接器會(huì)去這個(gè).o或.obj文件中找在b.cpp中實(shí)現(xiàn)的函數(shù),再把他們build到makefile中指定的那個(gè)可以執(zhí)行文件中漆撞。 (非常重要)

通常殴泰,編譯器會(huì)在每個(gè).o或.obj文件中都去找一下所需要的符號(hào),而不是只在某個(gè)文件中找或者說(shuō)找到一個(gè)就不找了浮驳。因此悍汛,如果在幾個(gè)不同文件中實(shí)現(xiàn)了同一個(gè)函數(shù),或者定義了同一個(gè)全局變量至会,鏈接的時(shí)候就會(huì)提示"redefined"员凝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市奋献,隨后出現(xiàn)的幾起案子健霹,更是在濱河造成了極大的恐慌,老刑警劉巖瓶蚂,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糖埋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡窃这,警方通過(guò)查閱死者的電腦和手機(jī)瞳别,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)杭攻,“玉大人祟敛,你說(shuō)我怎么就攤上這事≌捉猓” “怎么了馆铁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)锅睛。 經(jīng)常有香客問(wèn)我埠巨,道長(zhǎng),這世上最難降的妖魔是什么现拒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任辣垒,我火速辦了婚禮,結(jié)果婚禮上印蔬,老公的妹妹穿的比我還像新娘勋桶。我一直安慰自己,他們只是感情好侥猬,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布例驹。 她就那樣靜靜地躺著,像睡著了一般陵究。 火紅的嫁衣襯著肌膚如雪眠饮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天铜邮,我揣著相機(jī)與錄音仪召,去河邊找鬼。 笑死松蒜,一個(gè)胖子當(dāng)著我的面吹牛扔茅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秸苗,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼召娜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了惊楼?” 一聲冷哼從身側(cè)響起玖瘸,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秸讹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后雅倒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體璃诀,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蔑匣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了劣欢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡裁良,死狀恐怖凿将,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情价脾,我是刑警寧澤牧抵,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站彼棍,受9級(jí)特大地震影響灭忠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜座硕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一弛作、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧华匾,春花似錦映琳、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至旭旭,卻和暖如春谎脯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背持寄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工源梭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稍味。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓废麻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親模庐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烛愧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344