LP64 migration warning
64ビットコンパイルした時に、データサイズの計算式に対してワーニングが出る。
原因は、ssize_t型が64ビット整数であり、32ビット整数と64ビット整数の間で演算を行うため。
回避策は、64ビット整数だけを使って計算式を記述するか、又は sizeof(型名[要素数]) を使う。
以下、サンプルソース。
1 #include <stdio.h> 2 3 /* レコード構造定義 */ 4 typedef struct _T1 { 5 int a[16]; 6 int b[16]; 7 char c[16]; 8 } T1; 9 10 /* レコード数定義 */ 11 #define MAXREC (100) 12 #define MAXRECL (100L) 13 14 /* バッファ変数定義 */ 15 T1 v[MAXREC]; 16 T1 *p1 = &v[0]; 17 18 int main(int argc, char **argv) 19 { 20 printf("sizeof(T1) = %d\n", sizeof(T1)); 21 printf("sizeof(T1)*100 = %d\n", sizeof(p1[0]) * MAXREC); /* LP64 migration warning */ 22 printf("sizeof(T1)*100L = %d\n", sizeof(p1[0]) * MAXRECL); /* OK */ 23 printf("sizeof(T1)*100 = %d\n", sizeof(T1) * MAXREC); /* LP64 migration warning */ 24 printf("sizeof(T1)*100L = %d\n", sizeof(T1) * MAXRECL); /* OK */ 25 printf("sizeof(T1[100]) = %d\n", sizeof(T1[MAXREC])); /* OK */ 26 printf("sizeof(v) = %d\n", sizeof(v)); 27 28 return 0; 29 }
このソースをコンパイル・実行する。
$ c89 +DA2.0W +DS2.0 +M2 -D_XOPEN_SOURCE=500 ssize.c -o ssize cc: "ssize.c", line 21: LP64 migration warning 753: * converts 32 bit integer to long cc: "ssize.c", line 23: LP64 migration warning 753: * converts 32 bit integer to long $ ./ssize sizeof(T1) = 144 sizeof(T1)*100 = 14400 sizeof(T1)*100L = 14400 sizeof(T1)*100 = 14400 sizeof(T1)*100L = 14400 sizeof(T1[100]) = 14400 sizeof(v) = 14400