0

私は得ています

g++ -O3 cache-l1-line.cpp -o cache-l1-line -lrt
cache-l1-line.cpp: In function 'int main()':
cache-l1-line.cpp:33:58: warning: format '%d' expects argument of type 'int', but argument 2 has type 'long unsigned int' [-Wformat]

私の学校のサンファイアサーバーでは...しかし私のマシン(Arch Linux)ではありません。なぜそうかもしれません。問題の行は

printf("%d, %1.2f \n", i * sizeof(int), totalTime/TIMES);

iが定義されている場所:

for (int i = 4; i <= MAX_STRIDE/sizeof(int); i*=2)  {

問題は何ですか:GitHubの完全なソース(リビジョンへのリンク)

4

3 に答える 3

4

sizeof()size_tではなく を返しますint。そのような「特別な」タイプは、常にprintfフォーマットで期待されるタイプにキャストする必要があります。

printf("%d, %1.2f \n", (int)(i * sizeof(int)), totalTime/TIMES);

注: 自分のライブラリを掘り下げて型が typedef されているものを確認し、フォーマット文字列で適切な型を使用することを好む人もいます。ただし、これには 2 つの問題があります。まず、別のコンパイラでは異なる可能性があります。次に、 asize_tは ではなく、longですsize_t。したがって、より正式な観点からは、. を取るフォーマット引数がないため、常に型の不一致が発生しますsize_t

于 2012-10-07T09:43:12.427 に答える
1

64 ビット アーキテクチャでは、式は 64 ビットに評価されます。したがって、そのアーキテクチャでの適切な指定子は %llu になります。または逆に、指定子 %d で期待される幅と型に式をキャストする必要があります。

編集: %lld の代わりに %llu -- コメントありがとうございます。

式 (i * size_t) の幅と型は、アーキテクチャによって異なります。それは (unsigned int) 明らかに i3 システムにあり、(unsigned long long) は i7 システムにあります。

于 2012-10-07T09:52:41.737 に答える
0

通常、printf はタイプ セーフではありません。これは、次のようなものがある場合を意味します。

struct Point {int x, int y} point;
printf("%d", point);

コンパイルはできますが、実行するとクラッシュする可能性があります。しかし、gcc には、引数を使用してフォーマット文字列をチェックできる拡張機能があります。"%d" は int を想定していますが、"i * sizeof(int)" は long unsigned int 型であるため、警告が表示されます。

于 2012-10-07T09:39:05.373 に答える