如何在编译时选择函数行为?

时间:2017-08-02 22:09:46

标签: c c-preprocessor

我在以下示例中有4个文件;标头,默认实现文件和2个特定于平台的实现文件。我定义了两个函数; get_value_1get_value_2。 'default'行为是返回-1,但其中一些函数有特殊的实现。我希望每个函数只有在另一个文件没有实现时才返回-1。

/* interface.h *
***************/
int get_value_1();
int get_value_2();

/* default.c *
*************/
#include "interface.h"

#ifndef GET_VALUE_1
int get_value_1() { return -1; }
#endif

#ifndef GET_VALUE_2
int get_value_2() { return -1; }
#endif

/* platform1.c *
***************/
#include "interface.h"

#ifndef GET_VALUE_1
#define GET_VALUE_1
int get_value_1() { return 1; }
#endif

/* platform2.c *
***************/
#include "interface.h"

#ifndef GET_VALUE_2
#define GET_VALUE_2
int get_value_2() { return 2; }
#endif

但是当我运行命令gcc default.c platform1.c -shared -fpic -o platform1.so时,它告诉我我已经多次定义了get_value_1函数,并且它最初是在platform1.c中定义的。

那么我怎样才能拥有一组函数,其中这些函数的子集可以在编译时选择它们的行为?

1 个答案:

答案 0 :(得分:3)

在default.c中使weak和"正常"在您的平台文件中。所以如果platform.c文件实现这个函数并不弱,那么来自default.c的弱函数将被替换为链接时间。

它不是标准的一部分,但大多数编译器都支持它(它可以是pragma,属性或其他 - 你需要检查编译器文档)

gcc版本:

#define __weak __attribute__((weak))

/* interface.h *
***************/
int get_value_1();
int get_value_2();

/* default.c *
*************/
#include "interface.h"

#ifndef GET_VALUE_1
__weak  int get_value_1() { return -1; }
#endif

#ifndef GET_VALUE_2
__weak int get_value_2() { return -1; }
#endif

/* platform1.c *
***************/
#include "interface.h"

#ifndef GET_VALUE_1
#define GET_VALUE_1
int get_value_1() { return 1; }
#endif

/* platform2.c *
***************/
#include "interface.h"

#ifndef GET_VALUE_2
#define GET_VALUE_2
int get_value_2() { return 2; }
#endif