C 如果为函数定义定义了#的用法

C 如果为函数定义定义了#的用法,c,conditional-compilation,C,Conditional Compilation,我需要知道#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
编辑:
我试图将此代码用于我正在使用的两个不同平台。

它在语法上是正确的

这种组织方式的主要缺点是您重复测试和非测试用例的函数定义。从一个精心简化的例子中不可能看出问题的严重程度。另一种组织方式是,假设当前返回语句是更大量代码块的代理(至少在两种情况中的一种情况下):

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(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;
}
然而,您的实际函数不太可能如此简单,因此这不能很好地转换


总体目标是避免重复,避免函数中出现条件编译。

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

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

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

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

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

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

您想用它做什么?你期望什么?这个语法是有效的,但是正确性取决于你想要实现什么。你想用这个做什么?你期望什么?这个语法是有效的,但是正确性取决于你想要达到什么。我不同意你的观点。我认为,在不同的平台上实现不同的功能是可以的,因为这是功能点——抽象实现。但函数内部的条件编译将引导您使用函数,在不同的平台上执行不同的操作,并进行地狱般的测试。是的,我讨厌条件编译,但哪一个更糟糕?根据我自己的经验,避免代码重复是第一要务。对我来说,语法(函数声明)的重复是可以的。逻辑复制是功能提示。我不同意你的观点。我认为,在不同的平台上实现不同的功能是可以的,因为这是功能点——抽象实现。但函数内部的条件编译将引导您使用函数,在不同的平台上执行不同的操作,并进行地狱般的测试。是的,我讨厌条件编译,但哪一个更糟糕?根据我自己的经验,避免代码重复是第一要务。对我来说,语法(函数声明)的重复是可以的。逻辑复制提示功能。