在运行时导出C API限制

时间:2015-01-20 14:12:01

标签: c runtime modularity

我正在为嵌入式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);
}

有更好的方法吗?任何想法?

1 个答案:

答案 0 :(得分:2)

通常,您将有一些额外的API函数来检查基础功能。

例如,您可以实现一个如下所示的函数:

QueryCapabilities( CAPABILITIES_XYZ, &capa );

其中capa是一个结构,包含有关XZY范围和可用性(或任何您需要的)的各种信息。 使用此API的更高级别只需要检查功能,并根据需要进行调整或失败。

另一点是,当给出非完美参数时,API将执行的操作。一种常见的方法是“尽力而为”,您的API将使用提供的参数尽其所能。这可能包括忽略不受支持的参数和超出范围值(如果max X为10,11将设置为10)。如果重要参数无效,您可能会使该功能失败。另一种方法是一旦参数无效就失败,因为它表明上层程序没有意义。您还可以实现“尽力而为”,但在不正常时返回警告值。