2011-10-20 40 views
3

我正在使用來自C++代碼的選擇項目。代碼使用宏FD_ZERO, FD_SET, FD_ISSET等。不幸的是,這些宏使用'C'類型轉換,當它們編碼爲-Wold-style-cast時,它們會生成編譯器警告。只爲這些宏禁用-Wold-style-cast的最佳方法是什麼?舊式的使用sys/select.h宏轉換警告

我能想到的唯一選項是:

  1. 使用#pragma diagnostic使用宏
  2. 包裝在一個內聯函數的宏調用和關閉周圍的功能警告禁用功能的警告。

有沒有人有更好的方法?

+0

可能存在針對此問題的特定於編譯器的解決方案。如果你對這些感興趣,你需要告訴我們你正在使用哪個編譯器。 –

+0

這是一個使用GCC 4.4.3 – mark

回答

0

我用-Wall在C++代碼中使用select和那些宏,並且不會收到警告,但我不使用-Wold-style-cast。我認爲一個更好的方法是退後一步,重新考慮爲什麼不使用C風格演員很重要。我認爲,爲了與C標準庫函數接口,這是完全合適的。

C++ dynamic_cast方法對多態性和類很有用。 const_cast是去除常量的特例。 static_cast和C的(type)演員陣容非常相似。我不確定使用static_cast<type>可以提供超過(type)轉換的優點,只不過它是C++風格。與C的*(type*)&鑄造方法相比,reinterpret_cast<type>幾乎沒有什麼優勢,並且它們來的時候也很醜陋。

一般來說,鑄造需求意味着軟件設計的某些弱點,儘管dynamic_cast可以說是一個例外。雖然努力不需要在自己的代碼中進行強制轉換是值得稱道的,但我不認爲將這些值追溯應用於第三方庫(特別是標準或OS)是沒有多大價值的。

如果你真的不想在你的代碼中使用C風格的強制轉換,我會在編譯器設置之外設置一個策略,然後檢查你的代碼並刪除它們。如果你真的想讓編譯器爲你做這項工作,那麼你必須禁用你無法控制的軟件的警告。這可能比它值得的更多的工作,並且在某些情況下甚至是不必要的。例如,在達爾文,FD_ISSET在其實施中沒有演員。畢竟,比C風格的代碼更糟的做法遠比代碼更好。

+0

的編譯推薦使用C風格轉換隻是因爲你與C代碼交互似乎沒有多大意義。顯然你想盡量避免它們。如果你想知道爲什麼,那麼這是充滿了解釋。 – Arvid