我想为32位和64位系统编译以下 C 程序。
#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
我想要做的是修复此警告,而不必为两个“位”目标提供两个main.c文件。
是否有#ifndef
或其他预处理器条件我可以添加到main.c
的第14行来处理这种差异?
或者有不同的更好的方法来处理这个问题吗?
编辑:我使用了以下解决方案:
#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
答案 0 :(得分:4)
C99提供用于打印size_t
值的'z'修饰符;在格式字符串中使用它。
答案 1 :(得分:3)
答案 2 :(得分:2)
有关类似问题,请参阅here。
<强> LP64 强> _LP64 如果(且仅当),则定义这些宏,值为1 编译是针对目标的地方 int和指针都使用64位和 int使用32位。
答案 3 :(得分:0)
您不希望为每行代码提供一个#ifdef,它可能会有所不同 - 它不会缩放。
问题是sizeof()在64位上返回64位数量。一个可能的解决方案:
fprintf(stdout,“在堆上分配的内存:%u bytes \ n”,(unsigned int)(sizeof(int)* size));
如果您知道数量将始终为32位。
答案 4 :(得分:0)
如果您需要可移植到非C99编译器(例如Visual Studio),接受的答案是可以的,但由于您似乎只使用gcc,我强烈建议#define __STDC_FORMAT_MACROS并使用PRI *宏,正如我所描述的here。然后,每次需要打印64位整数时,您都不必使用不必要的#ifdefs代码。