两个版本的相同功能:内联和普通?

时间:2018-02-02 16:55:36

标签: c

我想内联一些功能,但是,它们在整个团队中共享,我不想强​​迫人们使用它们。

添加内联版本的最佳方法是什么?

// normal
int func1();
int func2();
// inline versions
inline int inl_func1() { ... }
inline int inl_func2() { ... }

这样的事情会有意义吗?

修改
理想的情况是:

  • 我不必两次编写相同的函数定义(函数体)。
  • 全部用单define处理。

3 个答案:

答案 0 :(得分:1)

也许您可以告诉那些希望内联函数在包含头文件之前定义特定宏的人:

#define WANT_INLINE_FUNC1
#include "awesome_funcs.h"

想要调用外部链接函数的人应该省略宏:

#include "awesome_funcs.h"

然后,在“awesome_funcs.h”中:

#ifdef WANT_INLINE_FUNC1
inline int func1(int param)
{
    /* function body here */
}
#else
extern int func1(int param);
#endif

您还需要在其中一个库文件中定义具有外部链接的函数副本,例如:在“awesome_funcs.c”中:

#define WANT_INLINE_FUNC1
#include "awesome_funcs.h"

/*
 * This will define func1 with external linkage,
 * but the function body is copied from the inline definition
 * in "awesome_funcs.h".
 */
extern int func1(int param);

编辑1

你可以将它与chux的答案结合起来,并充分利用两个世界(除非这会让你的用户感到困惑)。只需使用以下内容替换“awesome_funcs.h”中的func1

static inline int inl_func1(int param)
{
    /* function body here */
}

#ifdef WANT_INLINE_FUNC1
inline int func1(int param)
{
    return inl_func1(param);
}
#else
extern int func1(int param);
#endif

然后inl_func1将始终是内联版本,func1可能是也可能不是内联的,具体取决于在包含“awesome_funcs.h”之前是否定义了WANT_INLINE_FUNC1

答案 1 :(得分:1)

声明/定义inline版本并在头文件中使用不同的名称声明非inline版本。

// "func.h"

// normal
int func1(void);
int func2(void);
// inline versions
static inline int func1_inline(void) { ... }
static inline int func2_inline(void) { ... }

这允许用户使用任何一种形式或两种形式。没有令人信服的理由使用相同的名称,只允许一个表格。

对于某些呼叫需要速度与空间而非其他呼叫的代码,两者都很方便。

这样做有一个好处,即定义/实现func1(), func2()的.c文件可以使用简单的代码来保证等效的功能。

#include "func.h"

int func1(void) {
  return func1_inline();
}

int func2(void) {
  return func2_inline();
}

顺便说一句,声明int func1();这样的函数并不代表与int func1(void);相同。 int func1();表示func1返回int,但不提供有关可传递给它的信息。它更像伪代码int func1(...);

答案 2 :(得分:0)

  

添加内联版本的最佳方法是什么?

您最简单的行动方式是宣布这些功能的static内联版本:

static inline int func1() { ... }
static inline int func3() { ... }

函数名称不需要与相应的外部函数不同。但是,如果#include标题包含具有这些名称的函数声明,那么它们必须兼容,并且必须有先前的static声明。例如:

static inline int func1(/* params */);
static inline int func3(/* params */);

#include "our_functions.h"

// ...

static inline int func1(/* params */) {
    // implementation ...
}

static inline int func3(/* params */) {
    // implementation ...
}

这将允许您添加内联版本,而无需修改调用这些函数的外部版本的现有代码,并且不会影响任何其他翻译单元。至少有一种替代方案,但我认为没有任何建议可以根据您的具体情况推荐它。

相关问题