2009-04-14 39 views
2

我最近正在對我們的代碼庫進行更改,將其從float變爲long,以查找某些變量,並發現編譯器在我認識的區域中沒有生成錯誤消息仍然是錯誤的。這導致我添加-WConversion到編譯器標誌。但是,哎呀,這會導致一些虛假的錯誤消息。在下面的代碼片段中,我注意到了錯誤。我能做些什麼來在個案的基礎上抑制這個信息,或者哄gcc變得更聰明呢? -Wconversion標誌會在我們的代碼庫中生成數千個警告。我將不得不全面檢查它們嗎?哎呀。如何從gcc中關閉錯誤的f​​loat/long錯誤消息

#include <stdio.h> 
void 
takes_a_float (float some_num) { 
    printf("float Hello %f\n", some_num); 
} 
int 
main (int argc, char **argv) { 
    float my_boat = 1.0f; 
    takes_a_float ( my_boat); 
    exit (0); 
} 

gcc -Wconversion foo.c 
foo.c: In function `main': 
foo.c:13: warning: passing arg 1 of `takes_a_float' as `float' rather than `double' due to prototype 

$ gcc -v 
Reading specs from /usr/lib/gcc/x86_64-redhat-linux/3.4.6/specs 
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr /share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk --host=x86_64-redhat-linux 
Thread model: posix 
gcc version 3.4.6 20060404 (Red Hat 3.4.6-10) 

編輯

正如約翰·米利金指出,該-Wconversion標誌工作 '作爲設計的'。 (我原以爲是關於類型轉換,但事實證明它是將真正舊的C風格程序轉換爲ISO標準的C. Darn。我的gcc版本的gcc警告 文檔頁的閱讀並未給出我希望,但在任何情況下,我真正想要的是一些其他的警告標誌,以使將在如下因素代碼正確警告,並沒有給假警告。

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


void 
takes_a_long (long sad_story) { 
    printf("Long %lu\n", sad_story); 
} 

void 
takes_a_float (float my_boat) { 
    printf("Float %f\n", my_boat); 
} 

int 
main (int argc, char **argv) { 

    float my_boat  = 1.0f; 
    long sad_story = 1.0L; 

    // No warnings wanted 
    takes_a_float (my_boat); 
    takes_a_long (sad_story); 

    // Warnings required 
    takes_a_long (my_boat); 
    takes_a_float (sad_story); 

    exit (0); 
} 

編輯2

的真正的解決方案是升級我的編譯器,而不是公司爲了複雜的原因而願意做的事(嘆氣)

回答

2

只是從信息頁的猜測,你試過-Wno-traditional-conversion

編輯:我檢查了,它的工作原理,但遺憾的是,這隻適用於gcc 4.3和更新版本。從gcc 4.1手冊頁看來,您觀察到的行爲是-Wconversion本應在舊版本中執行的行爲,並且不會在正常的double -> float轉換中發出警告。

+0

我剛纔試了一下。沒有幫助。感謝您的建議。 – Leonard 2009-04-14 21:53:00

+0

我現在所要做的就是說服公司的另一個分支中的3層管理層來升級我們的編譯器。 :-(。感謝您的幫助 – Leonard 2009-04-14 23:12:56

+0

難道你不能只是爲了轉換而用gcc 4.3編譯代碼,然後繼續使用你的舊編譯器進行生產? – jpalecek 2009-04-15 08:55:42

3

manpage(也在http://lists.apple.com/archives/xcode-users/2008/Jul/msg00720.html):

-Wconversion

警告如果一個原型導致一個類型轉換就是從會發生什麼 不同於 在相同的參數沒有 原型。這包括轉換定點的 到浮動和副 反之亦然,和轉換改變定點 參數的 符號或寬度除了當相同 默認推廣。

因此,警告的執行與記錄完全一致。如果您想專門檢查一些轉化次數,則可以嘗試單次開啓-Wconversion,將其記錄到文件中,然後搜索longfloat轉換。


此選項顯然是旨在用於移植傳統的C到ISO/ANSI C.

0

我沒有得到這個警告,我想這是因爲我使用的是較新的海灣合作委員會的版本(4.3.3)。

2

我相信你是最有可能尋找的標誌是-Wall,你不妨與-std=XX其中XX是一個組合(C89 | gnu89 | C99 | gnu99 | ...),和/或可能-pedantic這是更討厭迂腐(或以上* LLY保持取決於你的心情:)

順便說一句,你忘了,包括stdlib.h中(出境()的原型。


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

void takes_a_float (float some_num) { 
    printf("float Hello %f\n", some_num); 
} 

int main (int argc, char **argv) { 
    float my_boat = 1.0; 
    takes_a_float ( my_boat); 
    exit(0); 
} 

和我的控制檯輸出:


[email protected]:stackoverflow$ gcc -Wall -pedantic long_float.c -o long_float 
[email protected]:stackoverflow$ gcc -v 
Using built-in specs. 
Target: i486-linux-gnu 
... 
gcc version 4.3.2 (Ubuntu 4.3.2-1ubuntu12) 

使用-Wall -pedantic逼着你寫乾淨的,明確的代碼,並可以幫助你抓住了很多潛在的愚蠢的錯誤。祝你好運。

我想知道「缺少警告」的訊息可能是因爲C型促銷規則。 (參見K & R The C Programming Language,第二版,第2.7節 - 類型轉換)。只是思考的食物。

我希望這會有所幫助。

編輯以添加額外的材料(下面):

splint(安全編程皮棉)或Gimple Software的PC-皮棉/ FlexLint whuch是C的靜態分析的lint實現另一種選擇或方法源代碼標記可疑和不可移植的構造。


[email protected]:stackoverflow$ splint sad_story.c 
Splint 3.1.2 --- 07 May 2008 

sad_story.c: (in function takes_a_long) 
sad_story.c:5:26: Format argument 1 to printf (%lu) expects unsigned long int 
        gets long int: sad_story 
    To ignore signs in type comparisons use +ignoresigns 
    sad_story.c:5:20: Corresponding format code 
sad_story.c: (in function main) 
sad_story.c:21:18: Function takes_a_long expects arg 1 to be long int gets 
         float: my_boat 
    To allow all numeric types to match, use +relaxtypes. 
sad_story.c:22:19: Function takes_a_float expects arg 1 to be float gets long 
         int: sad_story 
sad_story.c:12:15: Parameter argc not used 
    A function parameter is not used in the body of the function. If the argument 
    is needed for type compatibility or future plans, use /*@[email protected]*/ in the 
    argument declaration. (Use -paramuse to inhibit warning) 
sad_story.c:12:28: Parameter argv not used 
sad_story.c:4:6: Function exported but not used outside sad_story: takes_a_long 
    A declaration is exported, but not used outside this module. Declaration can 
    use static qualifier. (Use -exportlocal to inhibit warning) 
    sad_story.c:6:1: Definition of takes_a_long 
sad_story.c:8:6: Function exported but not used outside sad_story: 
        takes_a_float 
    sad_story.c:10:1: Definition of takes_a_float 

Finished checking --- 7 code warnings 

您也可以嘗試在金培爾的Online Testing這是清潔和漂亮的輸出FlexLint的例子。