Ich möchte das folgende Programm C für 32- und 64-Bit-Systeme kompilieren.Welche Präprozessordirektive oder andere Methode sollte ich verwenden, um eine 32- oder 64-Bit-Umgebung zu erkennen?
#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);
}
Was ich mit meiner Makefile
tun, ist in -m32
und -64
passieren bitspezifischer Binaries zu machen:
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
Dies funktioniert gut, aber ich laufe in eine Warnung beim Kompilieren:
Was ich tun möchte, ist diese Warnung zu beheben, ohne zwei main.c-Dateien für zwei "Bit" -Ziele zu haben.
Gibt es eine #ifndef
oder andere Präprozessor bedingte Ich kann Zeile 14 von main.c
hinzufügen, um diesen Unterschied zu behandeln?
Oder gibt es einen anderen und besseren Weg, damit umzugehen?
EDIT: habe ich die folgende Lösung:
#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
möglich Duplikat von [Wie kann ich feststellen, ob ich für eine 64-Bit-Architektur in C++ kompiliere] (http://stackoverflow.com/questions/163058/how-can-i-detect-if-im-compiling- for-a-64Bits-Architektur-in-c) – Suma
Nicht einmal in der Nähe. –