1. 程式人生 > >Qt 應用程式中使用 close系統呼叫函式 注意問題

Qt 應用程式中使用 close系統呼叫函式 注意問題

因qt QWidget有QWidget::close()函式,與系統呼叫函式close同名,這是qt設計不好的地方,因此在QWidget派生類函式中呼叫close系統呼叫就要使用全域性域符號“::”。

當時我出問題的程式碼如下:

void ButtonWindow::mousePressEvent ( QMouseEvent * e )//滑鼠單擊事件響應
{
 int i;
 int bfd;
 int rt;

 std::cout << "mouse clicked!\n";

 bfd = open("/dev/Buzzer", 0);

 if (bfd!=-1)
  printf("open '/dev/Buzzer success!'\n");
 else
 {
  printf("open '/dev/Buzzer fail!'\n");
  printf(strerror(errno));
  return;
 }

 rt = close(bfd); //注意此處使用錯誤,未加全域性域符號,預設呼叫ButtonWindow::close函式,應改為rt=::close(bfd)
 printf("close:rt=%d\n", rt);
 
 printf("close '/dev/Buzzer'!\n");
}

當時發現很奇怪,close函式總是返回1,與標準close函式返回值不符,且呼叫此句函式後,qt執行緒變為了殭屍執行緒。後來猛然發現qt QWidget有QWidget::close()函式,這也就能解釋為什麼qt介面沒有了,併成為殭屍執行緒了。這個問題我找了一天多,最後總算找到了。在此做下記錄,希望也能給遇到同樣問題的朋友提供參考吧。