用于函数定义的#if的用法

时间:2012-11-03 21:46:23

标签: c conditional-compilation

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

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

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

3 个答案:

答案 0 :(得分:5)

语法正确。

组织它的方法的主要缺点是你重复测试和非测试用例的函数定义。从一个精心最小化的例子中无法判断的是,将会出现多大的问题。组织它的另一种方法是,假设当前的返回语句是代码更大的代码块(至少在两种情况中的一种情况下),将是:

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;
}

但是,你的实际功能不太可能那么简单,所以这并不能很好地解释。

总体目标是避免重复,并避免在函数中显示条件编译。

答案 1 :(得分:0)

我能想到的唯一问题是冗余,对于一个严肃的项目来说,这是一个非常严重的问题。您应该尽可能减少代码重复,这是另一种方法,可以减少代码重复:

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

答案 2 :(得分:0)

您可以创建一个多平台库,将特定平台代码放在另一个特定的平台库中。这样,您的多平台库可以使用#if指令使用正确的特定库。换句话说,您将隔离特定的平台代码。