2016-05-03 62 views
0

我有這個C程序。函數返回錯誤類型的變量時沒有編譯錯誤

#include <stdio.h> 

unsigned char foo() 
{ 
    int x = 1000; 
    return x; 
} 

int main(int argc, char *argv[]) 
{ 
    printf("foo returns %d\n", foo()); 
} 

我使用以下編譯它:

gcc -c -g -o ../tgt/Linux/main.c.o -Wall -fpic main.c 
gcc ../tgt/Linux/main.c.o -g -o ../tgt/Linux/t -Wall 

它產生以下輸出:

$ t 
foo returns 232 

這在foo()x的低8位。所以,這是有道理的。但我的問題是:爲什麼這不會產生警告,並且有沒有辦法讓我爲這種類型的錯誤產生警告?

+6

使用'-Wconversion'編譯,你會注意到一個警告 –

+2

@AlterMann謝謝你。我想知道爲什麼在使用-'pedantic''-Wall'' -Wextra'時沒有觸發。 – jdarthenay

+0

char是C中的一個小整數。除非您使用-Wconversion標誌,否則不會出現任何錯誤,如@AlterMann所述。 –

回答

2

在註釋你提到:

我不知道爲什麼使用-pedantic -Wall -Wextra時都在不觸發。

-Wall不打開-Wconversion標誌[1]

無論-Wpedantic也不-pedantic會趕上

return x; // This is valid as per strict ISO C 

其實-pedantic只會檢查任何GNU C擴展[2]

例如,如果您編譯下面的東西:

int a=10; 
int b[a]; // This is invalid as per strict ISO C 

-pedantic,GCC應該給你:

warning: ISO C90 forbids variable length array ‘b’ [-Wvla] 

所以,唯一的選擇是使用-Wconversion明確而編制。

gcc -Wconversion main.c -o main 
相關問題