1

我需要知道#if defined 的用法是否正确,并知道以这种方式使用它的可能缺点。

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

编辑:我正在尝试将此代码用于我正在开发的两个不同平台。

4

3 回答 3

5

它在语法上是正确的。

这种组织方式的主要缺点是您重复测试和非测试用例的函数定义。从一个仔细最小化的例子中无法看出这将是一个多大的问题。另一种组织它的方法,假设当前的 return 语句是一个更重要的代码块的代理(至少在这两种情况下)将是:

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 回答