2010-07-31 85 views
4

在我的項目中,我打開了使用-pedantic-ansi標籤處理警告錯誤和編譯。我正在使用GCC編譯器。在這個項目中,我不得不使用第三方的源代碼,這個代碼有很多警告。由於我將警告視爲錯誤,因此我在修復代碼方面遇到困難。從'int'轉換爲'size_t'可能會改變結果的符號 - GCC,C

大多數警告是關於無效轉換從intsize_t或反之亦然。在某些情況下,我無法將兩個變量都設爲同一類型,我的意思是我無法將其改爲size_t。在這種情況下,我正在做一個明確的演員。類似的,

size_t a = (size_t) atoi(val); 

我想知道這是正確的做法嗎?這樣做有什麼問題嗎?

如果這些警告是次要的,我可以只在他們的文件中壓縮它嗎?我如何在MSVC上做同樣的事情?

+0

你當然可以在不同的文件上運行其他gcc命令行。 我的方法確實不會修復它們的代碼(因爲在以後版本的點點中不兼容)。如果他們在意你應該發送bugreports。 – 2010-07-31 06:56:47

回答

4

看一看OpenOffice的維基上的最佳實踐正確的代碼:http://wiki.services.openoffice.org/wiki/Writing_warning-free_code

他們建議對這些轉換的靜態類型轉換,然後提供一個編譯指示禁用特定的代碼段的警告。

+2

謝謝。我使用C而不是C++。 'static_cast'不可用。 – 2010-07-31 06:53:01

+1

在這種情況下,請用你的判斷力和明確的投送:) – 2010-07-31 07:02:02

7

編輯:

鑄造是唯一的方法,如果你想閉嘴每次的編譯器在便攜式的方式。只要你知道你在做什麼,例如您可以確保atoi的結果永遠不會爲負。

在GCC中,您可以用-Wno-sign-conversion標誌關閉所有符號轉換警告。還有-Wno-sign-compare(對於像2u > 1之類的東西),但除非您使用-Wextra,否則它將不相關。

您也可以使用diagnostic pragmas

#pragma GCC diagnostic ignored "-Wsign-conversion" 

在MSVC,有幾個警告相關的符號/無符號不匹配,如:

要在MSVC中禁用警告,您可以添加#pragma warning,例如

#pragma warning (disable : 4267) 

或在編譯器選項中添加一個/wd4267標誌。


也許你應該使用strtoul,而不是atoi

size_t a = strtoul(val, NULL, 0); 

(沒有警告只有size_tunsigned long大。在大多數平臺上,這是事實,但不能保證。)

的好處是,你可以進行錯誤檢查有了這個功能,例如

#include <stdlib.h> 
#include <stdio.h> 

int main() { 
    char val[256]; 
    fgets(val, 256, stdin); 
    char* endptr; 
    size_t a = strtoul(val, &endptr, 0); 
    if (val == endptr) { 
     printf("Not a number\n"); 
    } else { 
     printf("The value is %zu\n", a); 
    } 
    return 0; 
} 
+0

謝謝。僅顯示atoi就是一個例子。我的問題是關於在特定文件上投射和壓制特定警告。 – 2010-07-31 07:46:22

+0

+1加入事業根除'atoi()' – 2010-07-31 08:15:58

+0

所有使用這說明了。非常感謝你。 – 2010-07-31 08:41:35

-2

我個人認爲這種警告愚蠢的,並會關閉它,但你問這件事的事實表明,你可能會在整數類型和差異之間的轉換足夠陌生的符號和無符號警告可能對您有用的行爲。

另一方面,我真的很鄙視[明確]演員。建議使用strtoul而不是atoi可能是一個非常好的建議。我看到你評論說atoi僅僅是一個例子,但是同樣的原則一般適用:使用返回你想要的類型的函數,而不是強迫一個不同的類型變成你想要的類型。如果函數是你自己寫的而不是函數庫函數,這可能意味着修復函數返回size_t而不是int

相關問題