2016-05-03 11 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 Thanks man。私は、なぜ ''壁 '' -Wextra'を使っても、なぜ引き起こされないのだろうか? – jdarthenay

+0

charはCの小さな整数です。@ AlterMannは-Wconversionフラグを使用しない限りエラーは発生しません。 –

答えて

2

両方-pedantic -Wall -Wextraを使用するときにトリガされませんである私はなぜだろうか。

-Wall-Wconversionフラグ[1]をオンにしません。

-Wpedantic-pedanticどちらもただのGNU Cの拡張[2]かどうかを確認するでしょう実際-pedantic

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

をキャッチします。例えば

あなたはものの下にコンパイルした場合:-pedantic

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

を、GCCはあなたを与える必要があります。

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

だから、唯一のオプションは、コンパイル時に明示的に-Wconversionを使用することです。

gcc -Wconversion main.c -o main 
関連する問題