小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

GNU編碼標(biāo)準(zhǔn)

 Delores 2007-09-18
GNU編碼標(biāo)準(zhǔn)

引用私有程序
不要在任何情況下,為你在的GNU中的工作或者在工作中引用Unix的源代碼(或者任何其它私有程序)。如果你對一個(gè)Unix程序內(nèi)容有一些模糊的記憶,這并不因?yàn)橹憬^對寫程序來模仿它,但請?jiān)噲D在內(nèi)部使用不同的代碼行來組織它,因?yàn)檫@將使你工作的結(jié)果在細(xì)節(jié)上與Unix版本有所不同。例如,Unix工具通常進(jìn)行了優(yōu)化以使用最少的內(nèi)存;如果你更希望提高速度,你的程序?qū)泻艽蟮牟煌?。你可以在?nèi)核中保存整個(gè)輸入文件并且在內(nèi)存中掃描而不是使用stdio。
使用比Unix程序更新的、更明智的算法。不使用暫時(shí)文件。在一遍掃描而不是兩遍掃描中完成任務(wù)(我在assembler(匯編器)中這樣做了)?;蛘呦喾?,強(qiáng)調(diào)簡單性而不是速度。對于一些應(yīng)用程序來說,今天的計(jì)算機(jī)只要使用簡單的算法就夠了?;蛘咦⒅匾话阈?。例如,Unix程序通常使用靜態(tài)的表格和固定大小的字符串,這導(dǎo)致了不可改變的限制;用動態(tài)分配來代替。確認(rèn)你的程序處理了輸入文件為空和其它滑稽的情況。為增加擴(kuò)展性而增加一種程序語言并且用那種語言完成程序的一個(gè)部分。或者把程序的一部分修改成獨(dú)立的庫?;蛘哂靡粋€(gè)簡單的廢物收集器而不是在釋放內(nèi)存的時(shí)候精確地進(jìn)行跟蹤,
或者使用諸如obstacks這樣的新的GNU工具。

接受他人的奉獻(xiàn)
如果其他人發(fā)給你一段添加到你正在編寫程序中的代碼,我們需要準(zhǔn)許使用它的法律文書——我們將需要從你那里取得同樣的法律文書。程序的每個(gè)重要的貢獻(xiàn)者都必須簽署
某種法律文書以使得我們可以給程序一個(gè)清晰的標(biāo)題。僅有主要作者是不夠的。所以,在把來自于他人的任何共享添加到程序中之前,告訴我們以便我們可以做出安排以獲取文書。在你實(shí)際地使用貢獻(xiàn)之前,請等待直到我們告訴你我們已經(jīng)收到了簽署的文書。這即適用于你發(fā)行程序之前也適用于發(fā)行之后。如果你收到了一個(gè)修正bug的補(bǔ)丁,并且它們做了主要的修改,我們就需要為他提供法律文書。
你不需要為這里或者那里的少數(shù)幾行修改提供文書,因?yàn)閷τ谶_(dá)到版權(quán)目的沒有意義。還有,如果你從建議中獲得的僅僅是一些想法,而不是你實(shí)際上使用的代碼,你也不需要文書。例如,如果你寫了一個(gè)程序的不同解決方案,你并不需要獲得許可文書。
我知道這是十分麻煩的;它對我們來說也十分麻煩。但如果你不等待,你就可能誤入歧途,如果這個(gè)貢獻(xiàn)者的雇主不肯簽署棄權(quán)聲明怎么辦?你可能不得不再次把代碼剔除出來!最糟糕的情況是如果你忘記告訴我們其它的貢獻(xiàn)者,我們可能會因此而窘迫地出現(xiàn)在法庭上。

修改日志
為每個(gè)目錄維護(hù)一個(gè)修改日志,以記述對這個(gè)目錄下源文件的修改。這樣做的目的是使得在將來尋找bug的人可以指導(dǎo)大致是那些修改導(dǎo)致了錯(cuò)誤。通常,一個(gè)新的bug可以在最近進(jìn)行的修改中被找到。更重要的事,修改日志有助于消除程序的不同部分之間在概念上的不一致性;它們可以告訴我們概念沖突產(chǎn)生的歷史。使用Emacs命令M-x add-change在修改日之中創(chuàng)建一個(gè)新的條目。一個(gè)條目應(yīng)該包含一個(gè)星號、被修改的文件的名稱以及被擴(kuò)在括號內(nèi)的、被修改了的函數(shù)、變量或者任何東西。括號之后是冒號和對你對函數(shù)或變量的修改的說明。
用空行把無關(guān)的條目分隔開。如果兩個(gè)條目反映了同一個(gè)修改,因而它們一同工作,那就不要在它們之間使用空行。如果后續(xù)的條目針對的是相同的文件,那么你可以忽略文件名的星號。下面是一些例子:
* register.el (insert-register): Return nil.(jump-to-register): Likewise.* sort.el (sort-subr): Return nil.* tex-mode.el (tex-bibtex-file, tex-file, tex-region):Restart the tex shell if process is gone or stopped.(tex-shell-running): New function.* expr.c (store_one_arg): Round size up for move_block_to_reg.(expand_call): Round up when emitting USE insns.* stmt.c (assign_parms): Round size up for move_block_from_reg.
在這里沒有必要敘述修改的完整目錄和它們是如何協(xié)同工作的。把這些說明作為注釋放到代碼中更好一些。這就是說為什么只要給出“New function”就夠了;在源代碼中,與函數(shù)放在一起的注釋說明了它是做什么的。然而,有時(shí)為一大堆修改寫上一行文字以描述它們的整體目的是有用的。
在概念上,你可以把修改日志看作解釋原始版本與當(dāng)前版本的不同的“undo列表”。
人們可以閱讀當(dāng)前的版本;他們不需要修改日志告訴他們其中有什么。他們從修改日之中
得到的是關(guān)于早期版本的不同的清晰解釋。在你以簡單的方式修改函數(shù)的調(diào)用順序,并且你修改了所有對函數(shù)的調(diào)用時(shí),不必為所有的調(diào)用創(chuàng)建單獨(dú)的條目。只要在被調(diào)用的函數(shù)的條目中寫“All callers changed.”即可。在你僅僅修改了注釋或者文檔字符串的時(shí)候,為該文件寫一個(gè)條目,而不必提到函數(shù),就足夠了。只要寫"Doc fix."。不必為文檔文件維護(hù)修改日志。這是因?yàn)槲臋n不那么容易受到難以修正的錯(cuò)誤的影響。文檔不是由那些必須以精確地工程方式相互作用的部分組成的;要修改一個(gè)錯(cuò)誤,你不需要知道這個(gè)錯(cuò)誤傳播的歷史。
與其它實(shí)現(xiàn)的兼容性
作為一個(gè)特例,對于GNU中的工具程序和庫,它們應(yīng)該和Berkeley Unix相應(yīng)的部分向上兼容,如果標(biāo)準(zhǔn)C定義了它們的行為,那它們應(yīng)該和標(biāo)準(zhǔn)C向上兼容,如果POSIX規(guī)范定義了它們的行為,那它們也應(yīng)該與POSIX規(guī)范向上兼容。當(dāng)這些標(biāo)準(zhǔn)發(fā)生沖突的時(shí)候,為每個(gè)標(biāo)準(zhǔn)提供兼容模式是有用的。標(biāo)準(zhǔn)C和POSIX禁止進(jìn)行任何形式的擴(kuò)展。自由地進(jìn)行你的擴(kuò)展,并且把選‘-ansi’或‘-compatible’包括進(jìn)來以關(guān)閉你的擴(kuò)展。但是如果擴(kuò)展很可能導(dǎo)致任何實(shí)際程序或者腳本的崩潰,那么它可能實(shí)際上不是向上兼容的。嘗試一下重新定義它的界面。
當(dāng)一個(gè)特征僅僅被用戶(而不會被程序或者命令文件)所使用的時(shí)候,并且在Unix中它完成得并不好,請自由地用完全不同并且更好的方式代替它。(例如,用Emacs代替vi。)但同時(shí)提供兼容模式仍然是很好的。(現(xiàn)在有自由的vi實(shí)現(xiàn),所以我們提供了它。)歡迎提供Berkeley Unix沒有提供的有用功能。Unix中沒有的附加功能可能是有用的,但我們優(yōu)先復(fù)制那些Unix已經(jīng)有的功能。

Makefile慣例
本章敘述為GNU程序書寫Makefile的慣例。
Makefile的通用慣例
每個(gè)Makefile都應(yīng)該包含這一行:SHELL = /bin/sh
以避免那些由從環(huán)境中繼承SHELL變量的系統(tǒng)帶來的麻煩。(GNU make永遠(yuǎn)不會出現(xiàn)這個(gè)問題。)不要假定‘.’出現(xiàn)在用于尋找可執(zhí)行的命令的路徑中。當(dāng)你需要在make期間運(yùn)行作為你的包的一部分的程序時(shí),如果程序是作為make的一部分而創(chuàng)建的,請確保它使用了‘./’,或者如果文件是不會被改變的源代碼的一部分,請確保它使用了‘’$(srcdir)/’。
如果運(yùn)行‘configure’時(shí)使用了選項(xiàng)‘-srcdir’,那么‘./’與‘$(srcdir)/’之間的區(qū)別就十分重要。一下形式的規(guī)則:
foo.1 : foo.man sedscript        sed -e sedscript foo.man > foo.1
將在當(dāng)前目錄不是源代碼目錄的情況下導(dǎo)致錯(cuò)誤,這是因?yàn)?#8216;foo.man’和‘sedscript’不在當(dāng)前目錄中。在使用GNU make的時(shí)候,由于不論源文件在那里,‘make’的自動變量‘$<‘
都將表示它,所以在只存在一個(gè)依賴文件的情況下,依靠‘VPATH’來尋找源文件仍然是可行的。(許多版本的make只在隱含規(guī)則中設(shè)置‘$<‘。)如下的makefile目標(biāo):
foo.o : bar.c        $(CC) -I. -I$(srcdir) $(CFLAGS) -c bar.c -o foo.o
將被如下目標(biāo)所替代:
foo.o : bar.c        $(CC) $(CFLAGS) $< -o $@
以便使’VPATH’能夠正確地工作。當(dāng)目標(biāo)含有多的依賴文件時(shí),顯式地使用‘$(srcdir)’讓規(guī)則正常工作的最簡單辦法。例如,上述為‘foo.1’而提供的目標(biāo)最好被寫作:
foo.1 : foo.man sedscript        sed -s $(srcdir)/sedscript $(srcdir)/foo.man > foo.1
Makefile中的工具
書寫能夠在sh,而不是在csh,中運(yùn)行的Makefile命令(以及任何shell腳本,例如
configure)。不要使用任何ksh或者bash特殊的功能。為創(chuàng)建和安裝而提供的configure腳本和Makefile規(guī)則不要直接使用任何工具,除了以下的幾個(gè)之外:
cat cmp cp echo egrep expr grepln mkdir mv pwd rm rmdir sed test touch
堅(jiān)持使用這些程序通常支持的選項(xiàng)。例如,因?yàn)樵S多系統(tǒng)不支持‘mkdir -p’,盡管它可能有些方便,但不要使用它。
為創(chuàng)建和安裝而提供的Makefile規(guī)則還可以使用編譯器和相關(guān)的程序,但應(yīng)該通過make變量以便用戶對它們進(jìn)行替換。下面是一些我們所說的相關(guān)的程序:
ar bison cc flex install ld lexmake makeinfo ranlib texi2dvi yacc
在你使用ranlib的時(shí)候,你應(yīng)該測試它是否存在,并且僅僅在它存在的情況下運(yùn)行它,以使得發(fā)布版本在那些沒有ranlib的系統(tǒng)中也能夠工作。如果你使用了符號連接,你應(yīng)該為沒有符號連接的系統(tǒng)實(shí)現(xiàn)一個(gè)替代手段。你可以在只打算用于特定系統(tǒng)的Makefile的部分(或者腳本)中使用你能夠確認(rèn)在那些系統(tǒng)上存在的工具。

為用戶提供的標(biāo)準(zhǔn)目標(biāo)
所有的GNU程序應(yīng)該在它們的Makefile中含有下列目標(biāo):
‘all’
編譯整個(gè)程序。它應(yīng)該是缺省目標(biāo)。這個(gè)目標(biāo)不需要重新創(chuàng)建任何文檔文件;Info文件被包含在發(fā)布版本中,同時(shí),只有在用戶明確地要求創(chuàng)建DVI文件的時(shí)候才創(chuàng)建DVI文件。
‘install’
編譯程序并且把可執(zhí)行文件、庫文件等文件復(fù)制到它們在實(shí)際應(yīng)用中應(yīng)該存在的位置。如果存在一個(gè)可以檢測程序是否被正確地安裝了的簡單測試,本目標(biāo)將首先運(yùn)行這個(gè)測試。如果文件的安裝目錄不存在,該命令將創(chuàng)建這樣的目錄。它們包括由變量prefix和exec_prefix的值指明的目錄,以及需要的所有目錄。完成該任務(wù)的一種方式是按照后面所說明的方式通過目標(biāo)installdirs來完成。在任何用戶安裝man手冊的命令之前使用‘-’,以使得make忽略所有的錯(cuò)誤。錯(cuò)誤將在那些沒有安裝Unix man手冊文檔系統(tǒng)的系統(tǒng)中出現(xiàn)。
安裝Info文件的方式是用$(INSTALL_DATA)把它們復(fù)制到‘$(infodir)’中。(參見為指明命令而提供的變量),并且如果有程序install-info存在,那么就運(yùn)行它。install-info是一個(gè)腳本,它編輯Info ‘dir’文件以把給定的Info文件添加或者更新目錄項(xiàng)的腳本;它將是Texinfo包的一個(gè)部分。下面是用于安裝一個(gè)Info文件一個(gè)簡單規(guī)則:
$(infodir)/foo.info: foo.info# There may be a newer info file in . than in srcdir.        -if test -f foo.info; then d=.; \         else d=$(srcdir); fi; \        $(INSTALL_DATA) $$d/foo.info $@; \# Run install-info only if it exists.# Use ‘if’ instead of just prepending ‘-’ to the# line so we notice real errors from install-info.# We use ‘$(SHELL) -c’ because some shells do not# fail gracefully when there is an unknown command.        if $(SHELL) -c ‘install-info --version’ \           >/dev/null 2>&1; then \          install-info --infodir=$(infodir) $$d/foo.info; \        else true; fi
‘uninstall’
刪除所有由’install’目標(biāo)創(chuàng)建的所有安裝的文件(但不包括那些由諸如’make all’之類的目標(biāo)創(chuàng)建的,沒有被安裝的文件)。
‘clean’
從當(dāng)前目錄中刪除所有在創(chuàng)建程序過程中創(chuàng)建的文件。不要刪除那些紀(jì)錄配置情況的文件。有些文件可能是在創(chuàng)建過程中創(chuàng)建的,但因?yàn)樗鼈兪呛桶l(fā)布版本一起發(fā)布的,通常不是在創(chuàng)建過程中創(chuàng)建的,這樣的文件也需要保留下來。如果‘.dvi’文件不是發(fā)布版本的一部分,就刪除它們。
‘distclean’
從當(dāng)前目錄中刪除所有在程序的配置和創(chuàng)建過程中創(chuàng)建的文件。如果你解包源代碼并且在沒有添加任何其它文件的情況下創(chuàng)建程序,‘make distclean’將僅僅保留那些出現(xiàn)在發(fā)布版本中的文件。
‘mostlyclean’
類似于‘clean’,可能不會刪除少數(shù)人們通常不希望重新編譯的文件。例如,GCC的
‘mostlyclean’目標(biāo)不會刪除‘libgcc.a’,這是因?yàn)楹苌傩枰匦戮幾g并且重新編譯將花費(fèi)大量的時(shí)間。
‘realclean’
從當(dāng)前目錄中刪除所有可以由Makefile重新創(chuàng)建的文件。這通常包括所有由distclean刪除的文件,以及:由Bison生成的C源文件、標(biāo)記表(tags tables)、Info文件等等。然而有一個(gè)例外:即使‘onfigure’以通過使用Makefile中的規(guī)則重新創(chuàng)建,‘ake realclean’也不會刪除‘onfigure’更一般地說,‘ake realclean’不會刪除為了運(yùn)行‘onfigure’而存在的任何東西,并且隨后開始創(chuàng)建程序。
‘AGS’
為本程序更新標(biāo)記表(tags table)。
‘nfo’
生成所有需要的Info文件。書寫該規(guī)則的最佳方式是:
info: foo.infofoo.info: foo.texi chap1.texi chap2.texi        $(MAKEINFO) $(srcdir)/foo.texi
你必須在Makefile中定義變量MAKEINFO。它應(yīng)該運(yùn)行程序makeinfo,該程序是Texinfo發(fā)布版本的一部分。
‘vi’
為所有Xinfo文檔VI文件,比如:
dvi: foo.dvifoo.dvi: foo.texi chap1.texi chap2.texi        $(TEXI2DVI) $(srcdir)/foo.texi
你必須在Makefile中定義變量TEXI2DVI。它應(yīng)該運(yùn)行程序texi2dvi,該程序也是Texinfo
發(fā)布版本的一部分。作為另一個(gè)選擇,只要寫依賴文件并且允許GNU Make提供這個(gè)命令就行了。
‘ist’
為本程序創(chuàng)建一個(gè)發(fā)布版本tar文件。該tar文件將被設(shè)置以使得在tar文件中的文件名以子目錄名開頭,這個(gè)子目錄名是包用于發(fā)布的名字。這個(gè)名字可以包含版本號。例如,GCC版本1.40的發(fā)布tar文件將被解包到名為’gcc-1.40’的子目錄中。完成該任務(wù)的最簡單方式是以適當(dāng)?shù)拿Q創(chuàng)建一個(gè)子目錄,使用ln或者cp把正確的文件安裝到該目錄中,而后tar這個(gè)子目錄。目標(biāo)dist應(yīng)該顯式地依賴于發(fā)布版本中所有的非源文件,以確保它們在發(fā)布版本中都不是過時(shí)的。參見制作發(fā)布包
‘heck’
(如果有的話)執(zhí)行自檢測。用戶必須在運(yùn)行測試之前,但不必在安裝程序之前創(chuàng)建程序;你應(yīng)該寫下自檢測以便它們在程序創(chuàng)建之后而沒有被安裝之前進(jìn)行工作。對于那些適用于以下的目標(biāo)的程序,建議你按照常用的名字提供它們。
‘nstallcheck’
(如果有的話)執(zhí)行安裝監(jiān)測。用戶必須在運(yùn)行該檢測之前創(chuàng)建并且安裝程序。你不應(yīng)該假定’(bindir)’出現(xiàn)在搜索路徑中。
‘nstalldirs’
添加一個(gè)名為‘installdirs’的目標(biāo),以便創(chuàng)建安裝文件的目錄和它們的父目錄。有一個(gè)稱為‘mkinstalldirs’的腳本可以為此提供便利;在Texinfo包中可以找到它。你可以使用象下面那樣的規(guī)則:
# Make sure all installation directories (e.g. $(bindir))# actually exist by making them if necessary.installdirs: mkinstalldirs        $(srcdir)/mkinstalldirs $(bindir) $(datadir) \                                $(libdir) $(infodir) \                                $(mandir)

 

為指明命令而提供的變量
Makefile應(yīng)該提供變量以覆蓋某些命令、選項(xiàng)等等。特別地,你應(yīng)該通過變量來運(yùn)行大部分工具程序。因此,如果你使用了Bison,就定義一個(gè)缺省值是通過’BISON = bison’來設(shè)定的變量BISON,并且在你需要使用Bison的所有地方通過$(BISON)引用它。在這種方式下,文件管理工具:ln、rm、mv等等并不需要通過變量引用,這是因?yàn)橛脩舨恍枰闷渌绦騺硖娲鼈儭C總€(gè)程序名變量都應(yīng)該有一個(gè)對應(yīng)的變量以便為程序提供選項(xiàng)。把’FLAGS’附加到程序名變量名的后面就是選項(xiàng)變量名--例如,BISONFLAGS。(名字CFLAGS是這項(xiàng)規(guī)則的一個(gè)例外,但因?yàn)樗菢?biāo)準(zhǔn)的而保留了它。)在任何運(yùn)行預(yù)處理器的編譯命令中使用CPPFLAGS,在任何進(jìn)行連接的編譯命令和任何對ld的直接使用中使用LDFLAGS。
如果存在一些為了正確地編譯某些文件而必須使用的C編譯器選項(xiàng),不要把它們包括在CFLAGS中。用戶希望能夠自由地指明CFLAGS的值。替代的方式是:通過在編譯命令行中顯式地給出這些必要的選項(xiàng)或者通過定義一條隱含規(guī)則,從而以獨(dú)立于CFLAGS的方式把選項(xiàng)傳遞給C編譯器。
CFLAGS = -gALL_CFLAGS = -I. $(CFLAGS).c.o:        $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $<
把選項(xiàng)‘-g’包括在CFLAGS中,因?yàn)樗鼘τ谡_的編譯來說并不是必要的。你可以認(rèn)為它僅僅是關(guān)于缺省值的一個(gè)建議。如果包被設(shè)置成在缺省的狀態(tài)下由GCC編譯,那么你可能還需要把‘-O’包括在CFLAGS的缺省值之中。
把CFLAGS放在編譯命令行的最后,就是在其它包含了編譯選項(xiàng)的變量之后,以便于用戶使用CFLAGS來覆蓋其它的選項(xiàng)。每個(gè)Makefile都應(yīng)該定義變量INSTALL,它是把一個(gè)文件安裝到系統(tǒng)中的基本命令。每個(gè)Makefile還應(yīng)該定義變量INSTALL_PROGRAM和INSTALL_DATA。(兩者的缺省值都應(yīng)該是$(INSTALL)。)而后,Makefile應(yīng)該使用這些變量作為實(shí)際安裝的命令,分別用于安裝可執(zhí)行文件和不可執(zhí)行的文件。按照下面的方式使用這些變量:
$(INSTALL_PROGRAM) foo $(bindir)/foo$(INSTALL_DATA) libfoo.a $(libdir)/libfoo.a
總是把文件名,而不是目錄名,作為安裝命令的第二個(gè)參數(shù)。為每個(gè)需要安裝的文件使用獨(dú)立的命令。

為安裝目錄而提供的變量
安裝目錄總是應(yīng)該通過變量來命名,以易于把包安裝在其它非標(biāo)準(zhǔn)的位置。這些變量的標(biāo)準(zhǔn)名字是:
‘prefix’
用于構(gòu)造下列變量的缺省值的前綴。prefix的缺省值應(yīng)該是‘/usr/local’(至少現(xiàn)在是它)。‘exec_prefix’’
用于構(gòu)造下列某些變量的缺省值的前綴。exec_prefix的缺省值應(yīng)該是$(prefix)。一般來說,$(exec_prefix)指的是用于儲存與機(jī)器有關(guān)的文件(比如說可執(zhí)行文件和子程序庫)的目錄,而$(prefix)則被直接用于其它目錄。
‘bindir’
用于儲存用戶可以運(yùn)行的可執(zhí)行程序的目錄。一般來說應(yīng)該是‘/usr/local/bin’,但應(yīng)該被寫作‘$(exec_prefix)/bin’。
‘libdir’
用于安裝由程序運(yùn)行,而不是由用戶運(yùn)行的可執(zhí)行文件的目錄。Object文件和object代碼庫也應(yīng)該被儲存在這個(gè)目錄。提供該目錄的意圖是為了儲存適用于特殊機(jī)器結(jié)構(gòu),但又不必出現(xiàn)在命令路徑中的文件。libdir的值通常是‘/usr/local/lib’,但應(yīng)該被寫作‘$(exec_prefix)/lib’。
‘datadir’
用于安裝程序在運(yùn)行時(shí)需要訪問的只讀數(shù)據(jù)文件的目錄。該目錄用于儲存與使用的機(jī)器獨(dú)立的文件。它通常是‘/usr/local/lib’,但應(yīng)該被寫作‘$(prefix)/lib’。
‘statedir’
用于安裝程序在運(yùn)行時(shí)需要修改的數(shù)據(jù)文件的%9

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多