1

#if defined の使用法が正しいかどうか、およびこのように使用することの考えられる短所を知る必要があります。

#if defined TEST
int foo()
{
   return 0;
}
int foo1()
{
   return 0;
}
#else
int foo()
{
   return 1;
}
int foo1()
{
   return 1;
}
#endif

編集:私が取り組んでいる2つの異なるプラットフォームでこのコードを使用しようとしています。

4

3 に答える 3

5

構文的に正しいです。

このように編成する方法の主な欠点は、テスト ケースと非テスト ケースの両方で関数の定義を繰り返すことです。慎重に最小化された例からは、それがどれほどの問題になるかはわかりません。現在のreturnステートメントがより実質的なコードブロックの代理であると仮定すると(少なくとも2つのケースのいずれかで)、それを整理する別の方法は次のようになります。

int foo(void)
{
#if defined TEST
   return 0;
#else
   return 1;
#endif /* TEST */
}

int foo1(void)
{
#if defined TEST
   return 0;
#else
   return 1;
#endif /* TEST */
}

これらの正確な機能については、次のことができます。

#ifdef TEST
#define RETVAL 0
#else
#define RETVAL 1
#endif /* TEST */

int foo(void)
{
   return RETVAL;
}
int foo1(void)
{
   return RETVAL;
}

ただし、実際の関数はそれほど単純ではない可能性が高いため、これはうまく変換できません。

一般的な目標は、繰り返しを避け、関数に条件付きコンパイルが表示されるのを避けることです。

于 2012-11-03T21:53:47.577 に答える
0

私が考えることができる唯一の問題は冗長性であり、深刻なプロジェクトの場合、これは非常に深刻な問題です。コードの重複をできるだけ少なくする必要があります。これは、コードの重複を減らしてこれを行う別の方法です。

int foo()
{
#if defined TEST
   return 0;
#else
   return 1;
#endif
}
int foo1()
{
#if defined TEST
   return 0;
#else
   return 1;
#endif
}
于 2012-11-03T21:55:59.650 に答える
0

特定のプラットフォーム コードを別の特定のプラットフォーム ライブラリに配置して、マルチプラットフォーム ライブラリを作成できます。#ifそうすれば、マルチプラットフォーム ライブラリは、ディレクティブを使用して適切な特定のライブラリを使用できます。つまり、特定のプラットフォーム コードを分離します。

于 2012-11-03T22:05:46.293 に答える