我正在为嵌入式Linux设备编写C API。我的问题是该软件必须是可移植的(在不同的平台上运行),不需要进一步调整。不使用编译时密钥(#ifdefs)会很好。
问题是我需要从我的硬件和API中导出一些功能。这应该在运行时完成。
说,我是一个定义XYZ位置的结构,但范围可能不同, Z有时无法设定。除此之外,最好还是返回一个字符串。
struct position {
int x;
int y;
int z;
};
int go_to_position(struct position *next_position)
{
/* Do stuff */
return (0);
};
但是假设在某些情况下我只能改变x和y。在其他人中,只有y和z。
我想知道实现这个的最好方法,如果有一个知道模式。
我会做这样的事情:
#define PARAM_COUNT 3
enum { PARAM_X, PARAM_Y, PARAM_Y };
char*error_strings [PARAM_COUNT][PARAM_COUNT] = {
{"X don't work", Null , Null },
{Null, Null, "Z * Y cannot be larger than 10" },
{Null, "Z * Y cannot be larger than 10", Null },
};
char * check_position(struct position *position_to_check)
{
if( INTERNAL_CONSTRAINT(position_to_check->z, position_to_check->y)) {
return(error_strings[PARAM_Z][ PARAM_Y]);
}
if( INTERNAL_X_NOT_AVAILABLE() )
return(error_strings[PARAM_X][ PARAM_X]);
}
return (Null);
}
有更好的方法吗?任何想法?
答案 0 :(得分:2)
通常,您将有一些额外的API函数来检查基础功能。
例如,您可以实现一个如下所示的函数:
QueryCapabilities( CAPABILITIES_XYZ, &capa );
其中capa
是一个结构,包含有关XZY范围和可用性(或任何您需要的)的各种信息。
使用此API的更高级别只需要检查功能,并根据需要进行调整或失败。
另一点是,当给出非完美参数时,API将执行的操作。一种常见的方法是“尽力而为”,您的API将使用提供的参数尽其所能。这可能包括忽略不受支持的参数和超出范围值(如果max X为10,11将设置为10)。如果重要参数无效,您可能会使该功能失败。另一种方法是一旦参数无效就失败,因为它表明上层程序没有意义。您还可以实现“尽力而为”,但在不正常时返回警告值。