我需要知道#if defined 的用法是否正确,并知道以这种方式使用它的可能缺点。
#if defined TEST
int foo()
{
return 0;
}
int foo1()
{
return 0;
}
#else
int foo()
{
return 1;
}
int foo1()
{
return 1;
}
#endif
编辑:我正在尝试将此代码用于我正在开发的两个不同平台。
我需要知道#if defined 的用法是否正确,并知道以这种方式使用它的可能缺点。
#if defined TEST
int foo()
{
return 0;
}
int foo1()
{
return 0;
}
#else
int foo()
{
return 1;
}
int foo1()
{
return 1;
}
#endif
编辑:我正在尝试将此代码用于我正在开发的两个不同平台。
它在语法上是正确的。
这种组织方式的主要缺点是您重复测试和非测试用例的函数定义。从一个仔细最小化的例子中无法看出这将是一个多大的问题。另一种组织它的方法,假设当前的 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;
}
但是,您的实际功能不太可能如此简单,因此翻译效果不佳。
总体目标是避免重复,并避免在函数中显示条件编译。
我能想到的唯一问题是冗余,对于一个严肃的项目来说,这是一个非常严重的问题。您应该尽可能减少代码重复,这是另一种减少代码重复的方法:
int foo()
{
#if defined TEST
return 0;
#else
return 1;
#endif
}
int foo1()
{
#if defined TEST
return 0;
#else
return 1;
#endif
}
您可以创建一个多平台库,将特定平台代码放在另一个特定平台库中。这样,您的多平台库可以使用#if
指令使用正确的特定库。换句话说,您将隔离特定平台代码。