コンパイルに関する警告は引き続き表示されますが、修正方法がわかりません。
'%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;
}
sizeof
はsize_t
の代わりに%zu
を使用する必要があります%d
を返します。 size_t
のunsigned integerのタイプは(プラットフォームに応じて)異なる場合があり、longではない場合がありますunsigned intどこでも、ドラフトC99標準セクション6.5.3.4
sizeof operatorパラグラフ4:
結果の値は実装定義であり、そのタイプ(符号なし整数タイプ)はsize_tであり、(およびその他のヘッダー)で定義されています。
printf
に間違った書式指定子を使用することは未定義の動作であり、セクション7.19.6.1
で説明されているfprintf関数 、フォーマット指定子に関してprintf
もカバーしています:
変換仕様が無効な場合、動作は未定義です。248) 引数が対応する変換仕様の正しい型ではない場合、動作は未定義です。
更新
Visual Studio
z
形式指定子はサポートしていません :
Hh、j、z、およびtの長さのプレフィックスはサポートされていません。
この場合の正しい形式指定子は%Iu
です。
コンパイラは、精度が低下する可能性があることを警告しています。つまり、sizeof
、%d
を印刷するために使用している書式指定子は、size_t
の全範囲を印刷できません。 %d
を%zu
に変更すると、警告が消えます。
linuxでも同じ問題がありました。同じプログラムがWindowsでエラーなしで実行されます(「%d」はエラーなしで機能したことを意味します)が、Linuxではプログラムを実行するためにすべての「%d」を「%lu」に置き換える必要がありました。