web-dev-qa-db-ja.com

'%d'はタイプ 'int'の引数を期待していますが、引数2はタイプ 'long unsigned int' [-Wformat =]を持っています

コンパイルに関する警告は引き続き表示されますが、修正方法がわかりません。

'%d' expects argument of type 'int', but argument 2 has type 'long unsigned int' [

プログラムは正常に実行されますが、コンパイルに関する警告は引き続き表示されます。

/* Sizeof.c--Program to tell byte size of the C variable */
#include <stdio.h>

int main(void) {
    printf("\nA Char is %d bytes", sizeof( char ));
    printf("\nAn int is %d bytes", sizeof( int ));
    printf("\nA short is %d bytes", sizeof( short ));
    printf("\nA long is %d bytes", sizeof( long ));
    printf("\nA long long is %d bytes\n", sizeof( long long ));
    printf("\nAn unsigned Char is %d bytes", sizeof( unsigned char ));
    printf("\nAn unsigned int is %d bytes", sizeof( unsigned int));
    printf("\nAn unsigned short is %d bytes", sizeof( unsigned short ));
    printf("\nAn unsigned long is %d bytes", sizeof( unsigned long ));
    printf("\nAn unsigned long long is %d bytes\n",
            sizeof( unsigned long long ));
    printf("\nfloat is %d bytes", sizeof( float ));
    printf("\nA double is %d bytes\n", sizeof( double ));
    printf("\nA long double is %d bytes\n", sizeof( long double ));

    return 0;

}
18
LuizGsa13

sizeofsize_tの代わりに%zuを使用する必要があります%dを返します。 size_tunsigned integerのタイプは(プラットフォームに応じて)異なる場合があり、longではない場合がありますunsigned intどこでも、ドラフトC99標準セクション6.5.3.4sizeof operatorパラグラフ4

結果の値は実装定義であり、そのタイプ(符号なし整数タイプ)はsize_tであり、(およびその他のヘッダー)で定義されています。

printfに間違った書式指定子を使用することは未定義の動作であり、セクション7.19.6.1で説明されているfprintf関数 、フォーマット指定子に関してprintfもカバーしています:

変換仕様が無効な場合、動作は未定義です。248) 引数が対応する変換仕様の正しい型ではない場合、動作は未定義です。

更新

Visual Studioz形式指定子はサポートしていません

Hh、j、z、およびtの長さのプレフィックスはサポートされていません。

この場合の正しい形式指定子は%Iuです。

26
Shafik Yaghmour

コンパイラは、精度が低下する可能性があることを警告しています。つまり、sizeof%dを印刷するために使用している書式指定子は、size_tの全範囲を印刷できません。 %d%zuに変更すると、警告が消えます。

8
Fiddling Bits

linuxでも同じ問題がありました。同じプログラムがWindowsでエラーなしで実行されます(「%d」はエラーなしで機能したことを意味します)が、Linuxではプログラムを実行するためにすべての「%d」を「%lu」に置き換える必要がありました。

3
Suraj