0

次のCプログラムを 32 ビットおよび 64 ビット システム用にコンパイルしたいと考えています。

#include <stdio.h>                                                                                                                                                                  
#include <stdlib.h>                                                                                                                                                                 
#include <stddef.h>                                                                                                                                                                 

int main(int argc, char** argv) {
  size_t size = atoi(argv[1]);                                                                                                                                                      
  int *array;                                                                                                                                                                       

  array = malloc(size * sizeof(int));                                                                                                                                               
  if (array == NULL) {                                                                                                                                                              
    fprintf(stderr, "could not allocate memory\n");                                                                                                                                 
    exit(1);                                                                                                                                                                        
  }                                                                                                                                                                                  
  fprintf(stdout, "memory allocated on heap: %u bytes\n", sizeof(int)*size);                                                                                                        

  fprintf(stdout, "press Return to quit\n");                                                                                                                                        
  getchar();                                                                                                                                                                        

  fprintf(stdout, "freeing memory\n");                                                                                                                                              
  free(array);                                                                                                                                                                      

  exit(0);                                                                                                                                                                          
}         

私が自分で行ってきたことは、Makefileパスイン-m32-64てビット固有のバイナリを作成することです:

CFLAGS=-ansi -pedantic -Wall -O3
32BIT_ARCH=-m32
64BIT_ARCH=-m64
32_CFLAGS=${32BIT_ARCH} ${CFLAGS}
64_CFLAGS=${64BIT_ARCH} ${CFLAGS}
CC=gcc
ARRAY_32BIT_BINARY_NAME=arrayTest32
ARRAY_64BIT_BINARY_NAME=arrayTest64

all: ${ARRAY_32BIT_BINARY_NAME} ${ARRAY_64BIT_BINARY_NAME}
arrayTest32: main32_array.o 
             ${CC} ${32_CFLAGS} main32_array.o -o ${ARRAY_32BIT_BINARY_NAME}
arrayTest64: main64_array.o
             ${CC} ${64_CFLAGS} main64_array.o -o ${ARRAY_64BIT_BINARY_NAME}
main32_array.o: main.c
             ${CC} ${32_CFLAGS} -c main.c -o main32_array.o 
main64_array.o: main.c
             ${CC} ${64_CFLAGS} -c main.c -o main64_array.o 
clean:
             -rm *.o *~ ${ARRAY_32BIT_BINARY_NAME} ${ARRAY_64BIT_BINARY_NAME}
install:
             cp ${ARRAY_32BIT_BINARY_NAME} ${ARRAY_64BIT_BINARY_NAME} ../bin

これはうまく機能しますが、コンパイル時に警告が表示されます。

$ make                                                                                                                                   
gcc -m32 -ansi -pedantic -Wall -O3 -c main.c -o main32_array.o                                                                                                                      
gcc -m32 -ansi -pedantic -Wall -O3 main32_array.o -o arrayTest32                                                                                                                    
gcc -m64 -ansi -pedantic -Wall -O3 -c main.c -o main64_array.o                                                                                                                      
main.c: In function ‘main’:                                                                                                                                                         
main.c:14: warning: format ‘%u’ expects type ‘unsigned int’, but argument 3 has type ‘long unsigned int’                                                                            
gcc -m64 -ansi -pedantic -Wall -O3 main64_array.o -o arrayTest64  

私がやりたいことは、2 つの「ビット」ターゲットに対して 2 つの main.c ファイルを持たずにこの警告を修正することです。

この違いを処理#ifndefするために の 14 行目に追加できるプリプロセッサ条件はありますか?main.c

または、これを処理するための別のより良い方法はありますか?

編集:私は次の解決策を使用しました:

#if defined(__LP64__)                                                                                                                                                               
  fprintf(stdout, "memory allocated on heap: %lu bytes\n", sizeof(int)*size);                                                                                                       
#else                                                                                                                                                                               
  fprintf(stdout, "memory allocated on heap: %u bytes\n", sizeof(int)*size);                                                                                                        
#endif      
4

5 に答える 5

4

C99 は、値を出力するための 'z' 修飾子を提供しsize_tます。それをフォーマット文字列で使用します。

于 2009-05-15T19:26:37.980 に答える
2

同様の質問については、こちらを参照してください。

LP64 _LP64 これらのマクロは、コンパイルが long int とポインタの両方が 64 ビットを使用し、int が 32 ビットを使用するターゲット用である場合 (およびその場合にのみ)、値 1 で定義されます。

于 2009-05-15T19:21:22.907 に答える
0

C99以外のコンパイラ(Visual Studioなど)に移植できる必要がある場合は、受け入れられた答えは問題ありませんが、gccのみを使用しているように見えるため、#define __STDC_FORMAT_MACROSを使用し、PRI*マクロを使用することを強くお勧めします。ここで説明しました。そうすれば、64ビット整数を出力する必要があるたびに不要な#ifdefをコードに振りかける必要がなくなります。

于 2009-05-16T06:27:50.777 に答える
0

このように異なる可能性のあるコード行ごとに #ifdef を使用する必要はありません。スケールしません。

問題は、sizeof() が 64 ビットで 64 ビットの数量を返すことです。考えられる修正の 1 つ:

fprintf(stdout, "ヒープに割り当てられたメモリ: %u バイト\n", (unsigned int)(sizeof(int)*size));

数量が常に 32 ビットになることがわかっている場合。

于 2009-05-15T19:24:31.870 に答える