根据平台使用#ifdef表示不同数量的函数参数

时间:2014-06-16 01:25:08

标签: c function cross-platform

我要求状态函数应该在参数列表的开头为我正在处理的新平台接受一个新参数。

所以以下将是这个新平台的原型

void foo (int newarg, const char * a, int b, int c);

与前一种情况一样,只是

void foo (const char * a, int b, int c);

我关心的是可读性和代码空间。所以我在考虑使用ifdef,但我不确定在参数列表中使用def with是否是个好主意。

1)

void foo (
#ifdef __NEWPLATFORM__
    int newarg, 
#else
    const char * a, int b, int c
#endif
);

#if __NEWPALTFORM__
    void foo (int newarg, const char * a, int b, int c);
#else
    void foo (const char * a, int b, int c);
#endif

顺便说一下,我不能把新的参数放到列表的末尾,这会让它变得容易多了。

两者中哪一个(或者更好的解决方案)更好?

由于

2 个答案:

答案 0 :(得分:1)

鉴于您要将所有来电更改为foo

只需将foo更改为包含更多参数的函数,然后将#ifdef更改为函数内部的不同功能。

void foo (int newarg, const char * a, int b, int c){
   #ifdef __NEWPALTFORM__
   #else
   #endif
}

另外值得考虑的是函数的参数是否应该是一个结构,在这种情况下,未来的新参数不会成为问题。在您的问题中没有足够的背景来说明这是否是一个好主意

但它会是这样的:=

typedef struct {
   int newarg;
   const char* a;
   int b;
   int c;
} fooType;

    void foo(fooType f)   // either by value or by pointer depending on context
    {
      // #ifdefs...
    }

答案 1 :(得分:0)

第三种选择是有条件地为额外参数定义符号。您可以使用#ifdef部分包含其他有用的平台相关内容,例如:

#ifdef MY_NEW_PLATFORM
 #define EXTRA_ARGS int newarg,
 #define GET_EXTRA newarg
 #define SET_EXTRA(val) newarg = (val)
#else
 #define EXTRA_ARGS
 #define GET_EXTRA 0
 #define SET_EXTRA(val)
#endif

...

void foo (EXTRA_ARGS const char * a, int b, int c) {
  b = GET_EXTRA + c;  /* Just as example */
  SET_EXTRA(b+c);
}

正如您所看到的,foo函数没有分散注意力,#ifdefs"并且它可以在任何平台上编译。