版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章編譯預(yù)處理及程序調(diào)試鹽城本章主要內(nèi)容8.1編譯預(yù)處理及程序調(diào)試的引入8.2宏定義8.3文件包含8.4條件編譯8.5程序調(diào)試8.6綜合實(shí)例
8.1編譯預(yù)處理及程序調(diào)試的引入在前面章節(jié)的源程序中,我們經(jīng)??吹揭?include、#define開頭的行,這些代碼的功能是什么?如何利用?初學(xué)者在程序編寫過程中,經(jīng)常出現(xiàn)一些錯(cuò)誤,如何快速查找錯(cuò)誤、調(diào)試程序?8.1.1問題與引例
【引例】用函數(shù)的方法求兩個(gè)整數(shù)和兩個(gè)實(shí)數(shù)的最小數(shù)。問題分析:引例要求構(gòu)造函數(shù)求出兩個(gè)整型數(shù)據(jù)的最小數(shù)和求出兩個(gè)實(shí)型數(shù)據(jù)中的最小數(shù)。針對(duì)此類問題,必須構(gòu)造兩個(gè)不同數(shù)據(jù)類型的函數(shù)才能實(shí)現(xiàn)。8.1.1問題與引例8.1編譯預(yù)處理及程序調(diào)試的引入
#include<stdio.h>voidmain(){intintmin(intx,inty);//求整型數(shù)據(jù)最小數(shù)的函數(shù)聲明floatfloatmin(floatx,floaty);//求實(shí)型數(shù)據(jù)最小數(shù)的函數(shù)聲明inta,b,mini;floatc,d,minf;scanf("%d,%d",&a,&b);mini=intmin(a,b);//調(diào)用求整型數(shù)據(jù)最小數(shù)的函數(shù)scanf("%f%f",&c,&d);minf=floatmin(c,d);//調(diào)用求實(shí)型數(shù)據(jù)最小數(shù)的函數(shù)printf("mixint=%d,minfloat=%f\n",mini,minf);}
程序代碼設(shè)計(jì)如下://求整型數(shù)據(jù)最小數(shù)的函數(shù)定義intintmin(intx,inty){return(x<y?x:y);}//求實(shí)型數(shù)據(jù)最小數(shù)的函數(shù)定義floatfloatmin(floatx,floaty){return(x<y?x:y);}思考:請(qǐng)比較一下這兩個(gè)函數(shù),有何異同?數(shù)據(jù)類型不同其他代碼相同
8.1.2編譯預(yù)處理及程序調(diào)試的概念編譯預(yù)處理——編譯程序?qū)υ闯绦蜻M(jìn)行正式編譯之前由編譯預(yù)處理程序提前所做的工作,其目的是對(duì)程序中的特殊命令作出解釋,以產(chǎn)生新的源程序,對(duì)其進(jìn)行正式編譯。這里所謂的特殊命令就是編譯預(yù)處理命令,這是C語(yǔ)言的特色,具有使程序有良好的可移植性、可調(diào)試性,改善編程環(huán)境的優(yōu)點(diǎn)。C程序編寫完成后,在編譯、連接和運(yùn)行過程中可能發(fā)生各種錯(cuò)誤,查找并糾正錯(cuò)誤程序的過程,稱為程序調(diào)試。
8.1.2編譯預(yù)處理及程序調(diào)試的概念C語(yǔ)言的編譯預(yù)處理命令有宏定義、文件包含和條件編譯三種。宏定義可以簡(jiǎn)化C語(yǔ)言源程序的編寫,并具有類似函數(shù)的功能。文件包含命令可以將其他源程序文件包含進(jìn)來(lái),以簡(jiǎn)化重復(fù)編程的工作。條件編譯可以編寫易移植、易調(diào)試的程序,提高程序的執(zhí)行效率。在C語(yǔ)言源程序中允許用一個(gè)標(biāo)識(shí)符來(lái)表示一個(gè)字符串,稱為“宏”,被稱為“宏”的標(biāo)識(shí)符稱為“宏名”,#define稱為宏定義。編譯預(yù)處理時(shí),對(duì)程序中出現(xiàn)的所有“宏名”,都用宏定義中的字符串去替換,這稱為“宏替換”或“宏展開”。宏定義是由源程序中的宏定義命令完成的,宏替換是由預(yù)處理程序自動(dòng)完成的。在C語(yǔ)言中,“宏定義”分為無(wú)參宏定義和有參宏定義兩種。8.2宏定義
8.2宏定義8.2.1無(wú)參宏定義
無(wú)參宏定義的宏名后不帶參數(shù),用一個(gè)宏名標(biāo)識(shí)符代表一個(gè)字符串,相當(dāng)于一個(gè)符號(hào)常量。1.無(wú)參宏定義一般形式為:#define標(biāo)識(shí)符字符串例如:#definePI3.1415926宏定義的作用是在本程序文件中用指定的標(biāo)識(shí)符來(lái)代替指定的字符串。這里在編譯預(yù)處理時(shí),將程序中在該命令以后出現(xiàn)的所有的PI都用“3.1415926”代替。#include<stdio.h>#definePI3.1415926voidmain(){floatl,s,r,v;printf("inputradius:");scanf("%f",&r);l=2.0*PI*r;s=PI*r*r;v=4.0/3*PI*r*r*r;printf("l=%10.4f\ns=%10.4f\nv=%10.4f\n",l,s,v);}【例1】閱讀下列程序,體會(huì)不帶參數(shù)的宏定義功能。8.2.1無(wú)參宏定義(1)宏名一般習(xí)慣用大寫字母表示,以便與變量名相區(qū)別。但這并非規(guī)定,也可用小寫字母。(2)使用宏名代替一個(gè)字符串,可以減少程序中重復(fù)書寫某些字符串的工作量。(3)宏定義是用宏名代替一個(gè)字符串,只作簡(jiǎn)單置換,不作正確性檢查。只有在編譯已被宏展開后的源程序時(shí)才會(huì)發(fā)現(xiàn)語(yǔ)法錯(cuò)誤并報(bào)錯(cuò)。2.無(wú)參宏定義使用說(shuō)明8.2.1無(wú)參宏定義(4)宏定義不是C語(yǔ)句,不必在行末加分號(hào)。如果加了分號(hào)則會(huì)連分號(hào)一起進(jìn)行置換。(5)#define命令出現(xiàn)在程序中函數(shù)的外面,宏名的有效范圍為定義命令之后到本源文件結(jié)束。通常,#define命令寫在文件開頭,函數(shù)之前,作為文件一部分,在此文件范圍內(nèi)有效。(6)可以用#undef命令終止宏定義的作用域。
2.無(wú)參宏定義使用說(shuō)明8.2.1無(wú)參宏定義例:#defineG9.8______________voidmain()↑{G的有效范圍
…↓}------------#undefGf1(){…}在f1函數(shù)中,G不再代表9.8。這樣可以靈活控制宏定義的作用范圍。(7)在進(jìn)行宏定義時(shí),可以引用已定義的宏名,可以層層置換。(8)對(duì)程序中用雙撇號(hào)括起來(lái)的字符串內(nèi)的字符,即使與宏名相同,也不進(jìn)行置換。(9)宏定義是專門用于預(yù)處理命令的一個(gè)專用名詞,它與定義變量的含義不同,只作字符替換,不分配內(nèi)存空間。2、無(wú)參宏定義使用說(shuō)明#include<stdio.h>#defineR3.0#definePI3.1415926#defineL2*PI*R#defineSPI*R*Rvoidmain(){printf("L=%f\nS=%f\n",L,S);}運(yùn)行情況如下:L=18.849556S=28.274333【例2】
在宏定義中引用已定義的宏名。
2.無(wú)參宏定義使用說(shuō)明
8.2.2有參宏定義
C語(yǔ)言允許宏帶有參數(shù),稱為有參宏定義。宏定義中的參數(shù)稱為形式參數(shù),宏調(diào)用中的參數(shù)稱為實(shí)際參數(shù)。在調(diào)用中,不僅要宏展開,還要用實(shí)參去替換形參。(1)有參宏定義
有參宏定義一般形式為:#define
宏名(參數(shù)表)字符串
1.有參宏的定義與調(diào)用例如:#defineMAX(x,y)x>y?x:y//有參宏定義
#defineMPLUS(x,y)((x)*(y))
8.2.2有參宏定義
(2)有參宏調(diào)用有參宏調(diào)用的一般形式:宏名(實(shí)參表);
1.有參宏的定義與調(diào)用例如:m=MAX(3,5);p=MPLUS(3,5);//宏調(diào)用
8.2.2有參宏定義
1.有參宏的定義與調(diào)用(3)執(zhí)行過程程序中如果有帶實(shí)參的宏,則按#define命令行中指定的字符串從左到右進(jìn)行置換。如果字符串中包含宏中的形參(如x,y),則將程序語(yǔ)句中相應(yīng)的實(shí)參(可以是常量、變量或表達(dá)式)代替形參,而字符串中的其他字符則原樣保留。#defineN5+6#defineMN*N#defineM1(x)x*x#defineM2(x,y)x*yvoidmain(){printf(”%d\n”,M);printf(”%d\n”,M1(5-2));printf(”%d\n”,M2(6-1,2-1));}【例3】
分析下列程序的功能?!纠?】
分析程序中的for循環(huán)執(zhí)行的次數(shù)。#include<stdio.h>#defineN2#defineMN+1#defineNUM(M+1)*M/2voidmain(){inti;for(i=1;i<=NUM;i++)printf("%d\n",i); }(1)對(duì)帶參數(shù)的宏展開只是將語(yǔ)句中的宏名后面括號(hào)內(nèi)的實(shí)參字符串代替#define命令行中的形參。(2)在宏定義時(shí),在宏名與帶參數(shù)的括弧之間不應(yīng)加空格,否則將空格以后的字符都作為替代字符串的一部分。說(shuō)明:(1)函數(shù)調(diào)用時(shí),先求出實(shí)參表達(dá)式的值,然后代入形參。而使用帶參的宏只是進(jìn)行簡(jiǎn)單的字符替換。(2)函數(shù)調(diào)用是在程序運(yùn)行時(shí)處理的,為形參分配臨時(shí)的內(nèi)存單元。而宏展開則是在編譯前進(jìn)行的,在展開時(shí)并不分配內(nèi)存單元,不進(jìn)行值的傳遞處理,也沒有“返回值”的概念。(3)對(duì)函數(shù)中的實(shí)參和形參類型要求一致。而宏名無(wú)類型,它的參數(shù)也無(wú)類型,只是一個(gè)符號(hào)代表,展開時(shí)代入指定的字符串即可。宏定義時(shí),字符串可以是任何類型的數(shù)據(jù)。(4)調(diào)用函數(shù)只可得到一個(gè)返回值,而用宏可以設(shè)法得到幾個(gè)結(jié)果。帶參數(shù)的宏和函數(shù)的區(qū)別:(5)使用宏次數(shù)多時(shí),宏展開后源程序長(zhǎng),而函數(shù)調(diào)用不會(huì)使源程序變長(zhǎng)。(6)宏替換不占運(yùn)行時(shí)間,只占編譯時(shí)間。而函數(shù)調(diào)用則占運(yùn)行時(shí)間(分配單元、保留現(xiàn)場(chǎng)、值傳遞、返回)。帶參數(shù)的宏和函數(shù)的區(qū)別:如果善于利用宏定義,可以實(shí)現(xiàn)程序的簡(jiǎn)化,如事先將程序中的“輸出格式”定義好,以減少在輸出語(yǔ)句中每次都要寫出具體的輸出格式的麻煩。所謂“文件包含”處理是指一個(gè)源文件可以包含另外一個(gè)源文件的全部?jī)?nèi)容,以提高代碼的重用性。C語(yǔ)言提供了#include命令用來(lái)實(shí)現(xiàn)“文件包含”的操作。一般形式為:#include"文件名"或#include<文件名>8.3文件包含
注意:
在編譯時(shí)并不是分別對(duì)兩個(gè)文件分別進(jìn)行編譯,然后再將它們的目標(biāo)程序連接的,而是在經(jīng)過編譯預(yù)處理后將頭文件format.h包含到主文件中,得到一個(gè)新的源程序,然后對(duì)這個(gè)文件進(jìn)行編譯,得到一個(gè)目標(biāo)(.obj)文件。被包含的文件成為新的源文件的一部分,而單獨(dú)生成目標(biāo)文件。8.3文件包含1.#include命令行通常書寫在所用文件的最開始部分,所以有時(shí)也把包含文件稱做“頭文件”。頭文件名可以由用戶指定,其后綴不一定用“.h”。2.當(dāng)包含文件被修改后,對(duì)包含該文件的源程序必須重新進(jìn)行編譯連接,這樣才會(huì)使修改后的文件生效。3.文件包含允許嵌套,即在一個(gè)被包含文件中又可以包含另外的文件。4.一個(gè)#include命令只能包含一個(gè)頭文件,若有多個(gè)文件要包含,則需要多個(gè)#include命令,且必須一行一條,行尾不允許有分號(hào)。幾點(diǎn)說(shuō)明:8.3文件包含
8.4條件編譯所謂“條件編譯”,是對(duì)部分內(nèi)容指定編譯的條件,使其只在滿足一定條件才進(jìn)行編譯。條件編譯命令的幾種形式:(1)#ifdef標(biāo)識(shí)符程序段1#else
程序段2#endif(2)#ifndef標(biāo)識(shí)符程序段1#else
程序段2#endif(3)#if表達(dá)式程序段1#else
程序段2#endif8.5程序調(diào)試
一個(gè)C程序編寫完成后,在編譯、連接和運(yùn)行過程中可能發(fā)生各種錯(cuò)誤,因此,還應(yīng)對(duì)程序進(jìn)行調(diào)試和測(cè)試,盡可能發(fā)現(xiàn)錯(cuò)誤并予以糾正。
只有當(dāng)程序正確無(wú)誤地運(yùn)行時(shí),程序才編制完成。查找并糾正程序錯(cuò)誤的過程稱為調(diào)試,程序調(diào)試是程序開發(fā)過程中的一個(gè)不可缺少的環(huán)節(jié),需要通過實(shí)踐積累提高。8.5.1程序的錯(cuò)誤類型C語(yǔ)言程序的錯(cuò)誤類型主要有5種:編譯錯(cuò)誤、編譯警告、鏈接錯(cuò)誤、運(yùn)行錯(cuò)誤和邏輯錯(cuò)誤。8.5.1程序的錯(cuò)誤類型編譯錯(cuò)誤(error):是在編譯過程中發(fā)現(xiàn)的錯(cuò)誤,通常屬于語(yǔ)法錯(cuò)誤。編譯警告(warning):是在編譯過程中發(fā)現(xiàn)的、可能存在的潛在錯(cuò)誤。鏈接錯(cuò)誤:發(fā)生在將用戶程序的目標(biāo)代碼與用戶程序引用的庫(kù)函數(shù)的目標(biāo)代碼鏈接,生成可執(zhí)行代碼的過程中。邏輯錯(cuò)誤:發(fā)生在程序運(yùn)行階段,程序無(wú)語(yǔ)法錯(cuò)誤,也能正常運(yùn)行,但程序運(yùn)行結(jié)果不正確。運(yùn)行錯(cuò)誤:有時(shí)程序既無(wú)語(yǔ)法錯(cuò)誤,又無(wú)邏輯錯(cuò)誤,但程序不能正常運(yùn)行或結(jié)果不對(duì)。8.5.2編譯與連接錯(cuò)誤的查看與修改1.編譯錯(cuò)誤的查看與修改編譯的目的是將C源程序轉(zhuǎn)換為機(jī)器指令代碼。在編譯過程中,如果遇到程序中有語(yǔ)法錯(cuò)誤,則在集成開發(fā)環(huán)境底部的輸出窗口中顯示相應(yīng)的錯(cuò)誤信息,提示程序員修改程序。2.連接錯(cuò)誤的查看與修改在連接階段也可能出現(xiàn)一些錯(cuò)誤提示,但由于連接的對(duì)象是目標(biāo)程序,它并不指出錯(cuò)誤發(fā)生的詳細(xì)位置,不容易確定錯(cuò)誤的準(zhǔn)確位置。注意:在找到連接錯(cuò)誤并改正后,一定要重新編譯后才能再次連接。8.5.3運(yùn)行與邏輯錯(cuò)誤的判斷與調(diào)試運(yùn)行錯(cuò)誤是在程序運(yùn)行時(shí)發(fā)生的,編譯和連接過程均正常,當(dāng)運(yùn)行時(shí)表現(xiàn)為突然終止程序運(yùn)行、死循環(huán)、死機(jī)、自動(dòng)重啟或者輸出信息混亂等。與編譯錯(cuò)誤相比,運(yùn)行階段的錯(cuò)誤更難查找和判斷,原因是很少或根本沒有提示信息。注意:在找到連接錯(cuò)誤并改正后,一定要重新編譯后才能再次連接?!纠?.6】分析下列程序,根據(jù)不同數(shù)據(jù)檢測(cè)有無(wú)錯(cuò)誤。#include<stdio.h>voidmain(){inta,b,c;scanf(”%d,%d”,&a,&b);c=a/b;printf(”%d\n”,c);}b為非零值和零值均測(cè)試1.靜態(tài)檢查在編寫好程序并保存后,首先要進(jìn)行人工檢查,盡可能養(yǎng)成嚴(yán)謹(jǐn)?shù)目茖W(xué)作風(fēng),對(duì)每一步進(jìn)行把關(guān),以避免由于疏忽而造成的錯(cuò)誤。為了更有效地進(jìn)行人工檢查,編寫的程序應(yīng)力求做到如下幾點(diǎn):(1)采用結(jié)構(gòu)化程序方法編程,以增加可讀性;(2)盡可能增加注釋,以便于理解;(3)對(duì)復(fù)雜程序,盡可能用不同函數(shù)實(shí)現(xiàn)單獨(dú)功能,在主函數(shù)中調(diào)用等。8.5.4程序調(diào)試的步驟2.動(dòng)態(tài)檢查靜態(tài)檢查無(wú)誤后,再進(jìn)行動(dòng)態(tài)檢查(程序調(diào)試)。由編譯系統(tǒng)進(jìn)行檢查,發(fā)現(xiàn)錯(cuò)誤的過程稱為動(dòng)態(tài)檢查。在編譯時(shí)可根據(jù)語(yǔ)法錯(cuò)誤的提示信息進(jìn)行修改并重新編譯。8.5.4程序調(diào)試的步驟對(duì)于運(yùn)行階段的錯(cuò)誤,有以下幾種調(diào)試手段:標(biāo)準(zhǔn)數(shù)據(jù)校驗(yàn):用若干組已知結(jié)果的標(biāo)準(zhǔn)數(shù)據(jù)對(duì)程序進(jìn)行檢驗(yàn)。程序跟蹤:讓程序一句一句執(zhí)行,通過觀察和分析程序執(zhí)行過程中數(shù)據(jù)和程序執(zhí)行流程的變化來(lái)查找錯(cuò)誤。邊界檢查:在設(shè)計(jì)檢驗(yàn)數(shù)據(jù)時(shí),應(yīng)重點(diǎn)檢驗(yàn)邊界和特殊情況。簡(jiǎn)化循環(huán)次數(shù):調(diào)試時(shí)為加快調(diào)試速度,可對(duì)程序適當(dāng)做些簡(jiǎn)化。如減少循環(huán)次數(shù)、縮小數(shù)組規(guī)模、屏蔽某些次要程序段等。8.5.4程序調(diào)試的基本手段【例8.7】利用海倫公式求三角形面積,其中三條邊長(zhǎng)a,b,c從鍵盤上輸入。8.6綜合實(shí)例(1)算法分析程序主要完成以下任務(wù):輸入三條邊長(zhǎng)a,b,c;根據(jù)輸入的a,b,c的值判斷能否組成三角形,若能組成三角形,利用海倫公式求三角形面積,其中p=(a+b+c)/2.0;判斷能否組成三角形的條件是任意兩邊之和大于第三邊。(2)程序代碼#include<stdio.h>#include<math.h>voidmain(){ floata,b,c,p,area,x; printf("請(qǐng)輸入三個(gè)數(shù):"); scanf("%f%f%f",&a,&b,&c); if(a+b>c&&b+c>a&&a+c>b) {p=(a+b+c)/2.0; x=(p*(p-a)*(p-b)*(p-c)); if(x<0) x=-x; area=sqrt(x); printf("area=%6.2f\n",area); } else printf("dataerror\n");}(3)程序調(diào)試調(diào)試運(yùn)行程序時(shí),所取的測(cè)試數(shù)據(jù)為分支結(jié)構(gòu)中不同條件的數(shù)據(jù),以保證每個(gè)分支都有可能被執(zhí)行。第一次運(yùn)行
請(qǐng)輸入三個(gè)數(shù):345area=6.000000第二次運(yùn)行
請(qǐng)輸入三個(gè)數(shù):123dataerror8.6綜合實(shí)例【例8.9】用單步執(zhí)行程序的方法演示下列循環(huán)的執(zhí)行過程。(1)給定如下源程序代碼#include<stdio.h>voidmain(){inti,//循環(huán)控制變量
start,/
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度交通樞紐工程承包合同協(xié)議4篇
- 2025年湖北揚(yáng)帆旅游發(fā)展有限公司招聘筆試參考題庫(kù)含答案解析
- 2025年浙江嘉興捷固五金有限公司招聘筆試參考題庫(kù)含答案解析
- 2025年廣東深圳市龍崗區(qū)融媒集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 2025年浙江溫州浙南糧食有限公司招聘筆試參考題庫(kù)含答案解析
- 二零二五年度棉花運(yùn)輸安全風(fēng)險(xiǎn)評(píng)估與管理合同4篇
- 2025年高速公路養(yǎng)護(hù)工程勞務(wù)分包合同模板4篇
- 2025年度綠色環(huán)保獸藥銷售合作框架協(xié)議3篇
- 2025年度個(gè)人住宅建筑防水工程售后服務(wù)合同4篇
- 運(yùn)城師范高等??茖W(xué)校《民族文化遺產(chǎn)保護(hù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 北師大版小學(xué)三年級(jí)上冊(cè)數(shù)學(xué)第五單元《周長(zhǎng)》測(cè)試卷(含答案)
- 國(guó)家安全責(zé)任制落實(shí)情況報(bào)告3篇
- DB45T 1950-2019 對(duì)葉百部生產(chǎn)技術(shù)規(guī)程
- 2024年度順豐快遞冷鏈物流服務(wù)合同3篇
- 六年級(jí)下冊(cè)【默寫表】(牛津上海版、深圳版)(漢譯英)
- 合同簽訂培訓(xùn)
- 新修訂《保密法》知識(shí)考試題及答案
- 電工基礎(chǔ)知識(shí)培訓(xùn)課程
- 鐵路基礎(chǔ)知識(shí)題庫(kù)單選題100道及答案解析
- 金融AI:顛覆與重塑-深化理解AI在金融行業(yè)的實(shí)踐與挑戰(zhàn)
- 住宅樓安全性檢測(cè)鑒定方案
評(píng)論
0/150
提交評(píng)論