我在以下示例中有4个文件;标头,默认实现文件和2个特定于平台的实现文件。我定义了两个函数; get_value_1
和get_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中定义的。
那么我怎样才能拥有一组函数,其中这些函数的子集可以在编译时选择它们的行为?
答案 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