既存の回答は、型のサイズに基づいて「コンパイル時のアサーション」の効果を達成する方法を示しています。これは、この特定のケースでOPのニーズを満たす可能性がありますが、タイプのサイズに基づいて条件付きプリプロセッサが本当に必要になるケースもあります。方法は次のとおりです。
次のような小さなCプログラムを作成します。
/* 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); }
コンパイルします。上記のCプログラムを実行し、その出力をキャプチャする、お気に入りのスクリプト言語でスクリプトを記述します。その出力を使用して、Cヘッダーファイルを生成します。たとえば、Rubyを使用している場合、次のようになります。
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
次に、Makefileまたはその他のビルドスクリプトにルールを追加します。これにより、上記のスクリプトを実行してビルドしsizes.h
ます。
sizes.h
サイズに基づいてプリプロセッサ条件を使用する必要がある場所に含めます。
できた!
(./configure && make
プログラムを作成するために入力したことはありますか?configure
基本的に上記と同様に、どのようなスクリプトが実行されますか...)