たとえば、私は最近、これをLinuxカーネルで見つけました。
/ *条件が真の場合、コンパイルエラーを強制します* / #define BUILD_BUG_ON(condition)((void)sizeof(char [1-2 * !!(condition)]))
したがって、コードで、たとえばいくつかのハードウェア制約のために、サイズが8バイトの倍数でなければならない構造がある場合は、次のようにすることができます。
BUILD_BUG_ON((sizeof(struct mystruct)%8)!= 0);
また、構造体mystructのサイズが8の倍数でない限り、コンパイルされません。8の倍数の場合、ランタイムコードはまったく生成されません。
私が知っているもう1つのトリックは、1つのヘッダーファイルで1つのモジュールの変数を宣言および初期化しながら、そのモジュールを使用する他のモジュールで変数を宣言し、初期化するだけで、それらをexternとして宣言することです。
#ifdef DEFINE_MYHEADER_GLOBALS #define GLOBAL #define INIT(x、y)(x)=(y) #そうしないと #define GLOBAL extern #define INIT(x、y) #endif GLOBAL int INIT(x、0); グローバルint somefunc(int a、int b);
これで、xとsomefuncを定義するコードは次のようになります。
#define DEFINE_MYHEADER_GLOBALS #include "the_above_header_file.h"
一方、単にxとsomefunc()を使用しているコードは、次のことを行います。
#include "the_above_header_file.h"
したがって、グローバルのインスタンスと関数プロトタイプの両方が必要な場所で宣言されている1つのヘッダーファイルと、対応するextern宣言を取得します。
それで、それらの線に沿ってあなたの好きなCプログラミングトリックは何ですか?
BUILD_BUG_ON
マクロについては、#error
insideと#if
?