原文出處:http://blog.sina.com.cn/s/blog_6c1922aa01013jro.html
從串口調試助手向SerialPortTest發送訊息時,報錯了,說“comstat
is being used without defining",在SerialPort.CPP中,可以找到comstat的定義:COMSTAT comstat; 但將游標指向comstat時右鍵轉到定義處或聲明處,卻均提示“未定義符號”,這便是CSerialPort類在VC.NET應用中的問題了。那該如何解決這個問題呢?在這,我們向大家提供兩種解決方案:
方案1: 改變項目配置屬性
一種解決方案是改變基本運行時檢查(changing the runtime checks in project settings):在菜單Project->Project
properties-> C/C++ -> Code generation-> Basic Runtime checks --> change to 'Default',在中文版中是:項目-〉屬性-〉配置屬性-〉C/C++代碼產生-〉基本運行時檢查-〉設定為預設,當將基本運行時檢查改為預設之後,編譯自然順利通過了,向串口調試助手發送訊息正常了,再從串口調試助手向SerialPortTest發送訊息時,也正常了。
方案2:改變comstat變數屬性
另一種解決方案是將CSerialPort.CPP中的COMSTAT comstat;改為static
COMSTAT comstat;這樣改了之後,debug順利通過,然後調試,與串口調試助手相互發訊息都OK了。為什麼這樣就能解決呢?其實當你使用debug解決方案時,它的基本運行時檢查初始設定為:兩者(/RTC1,等同於 /RTCsu),這個兩者是指:堆疊框架(/RTCs),未初始化的變數(/RTCu)。由於它要檢查未初始化的變數,所以將SerialPort.cpp中的COMSTAT comstat;改為static COMSTAT comstat;就可以正常使用CSerialPort類了。
以上是在debug下的解決方案,當在Release編譯狀態時,你會發現並不需要將COMSTAT comstat;改為static COMSTAT comstat;就能編譯成功並且發送接收訊息正常。其實,在Release下,它的基本運行時檢查初始設定已為預設。這應該也算是第一種解決方案之內。
而當你將它設定為兩者(/RTC1,等同於 /RTCsu)時,不論是否將COMSTAT comstat;改為static COMSTAT comstat;,編譯都不能通過,報錯““cl.exe”返回的結果有誤。",這個應該是屬於Release的問題了,另當別論了。