プリプロセッサディレクティブ#ifdef
は条件付きコンパイルを行います。これがバイナリの非互換性につながるかどうかは、#ifdef
と対応する#endif
の間にあるかどうかによって決まります。たとえば、次のように明らかにまったく影響がないでしょう。
#ifdef FOO
#endif
FOO
が定義されているかどうかは関係ありませんが、コンパイルされたコードはまったく同じに見えます。
ただし、以下は確かに非互換性の原因となります。
ここ
#ifdef HAS_FOO_STRUCT
typedef foo foo_type;
#else
struct foo_type {};
#endif
void bar(foo_type);
、HAS_FOO_STRUCTが定義されている場合、bar(foo_type)
が実際にbar(foo)
であり、そのようなものとして台無しされます。一方、HAS_FOO_STRUCT
が定義されていない場合、foo_type
は実際にこの名前のタイプです。したがって、bar(foo_type)
はその名前をmangled inにします。これはバイナリの非互換性があります。
定義されたマクロの違いは、いくつかの異なる場所から来る場合があることに注意してください。第1に、異なるコンパイラバージョンが異なるマクロを定義する(またはマクロを異なる値に定義する)ことがあります。たとえば、コンパイルするシステムのタイプを識別するマクロと、コンパイラのバージョンを識別するマクロがあります。マクロの相違点は、システムヘッダーファイルに由来する可能性があります。これは異なる#define
を持つ可能性があります。さらに、ビルドシステムは、システム上に特定のもの(例えば、プリインストールされたライブラリ)が見つかったか見つからなかったかを示すマクロを定義することができる。
コンパイル時に表示されないより微妙なバイナリの非互換性を防ぐために、バイナリの非互換性は意図的である可能性があることに注意してください。
'#ifdef'ブロック内にはどのようなコードがありますか?そのことを知らずに問題が何であるかを知ることは不可能です。 – Mat
ディレクティブはどのようなシンボルをテストしますか? – Bingo
CPUの種類、OSのバージョン、カーネルのバージョン、コンパイラのバージョンなど、2つの環境には多少の違いがあるはずです。慎重に確認してください。 – ciphor