Die vorhandenen Antworten zeigen nur, wie der Effekt von "Zusicherungen zur Kompilierungszeit" basierend auf der Größe eines Typs erzielt werden kann. Dies mag in diesem speziellen Fall den Anforderungen des OP entsprechen, aber es gibt andere Fälle, in denen Sie wirklich einen Präprozessor benötigen, der von der Größe eines Typs abhängig ist. So geht's:
Schreiben Sie sich ein kleines C-Programm wie:
/* you could call this sizeof_int.c if you like... */
#include <stdio.h>
/* 'int' is just an example, it could be any other type */
int main(void) { printf("%zd", sizeof(int); }
Kompiliere das. Schreiben Sie ein Skript in Ihrer bevorzugten Skriptsprache, das das obige C-Programm ausführt und dessen Ausgabe erfasst. Verwenden Sie diese Ausgabe, um eine C-Header-Datei zu generieren. Wenn Sie beispielsweise Ruby verwenden, sieht es möglicherweise so aus:
sizeof_int = `./sizeof_int`
File.open('include/sizes.h','w') { |f| f.write(<<HEADER) }
/* COMPUTER-GENERATED, DO NOT EDIT BY HAND! */
#define SIZEOF_INT #{sizeof_int}
/* others can go here... */
HEADER
Fügen Sie dann Ihrem Makefile oder einem anderen Build-Skript eine Regel hinzu, mit der das oben zu erstellende Skript ausgeführt wird sizes.h
.
Fügen sizes.h
Sie ein, wo immer Sie Präprozessor-Bedingungen verwenden müssen, die auf Größen basieren.
Getan!
(Haben Sie jemals geschrieben ./configure && make
, um ein Programm zu erstellen? Was configure
Skripte tun, ist im Grunde genau wie oben ...)