0

我正在编写一个共享/动态库(https://github.com/zsawyer/mumble-LinkAPI)。

为此,我将为共享内存结构中的数据提供一些基本的访问器(get、set 和 update)(不能更改,因为它是外部定义的)。我的图书馆将提供相当多的访问器。Getter 和 Setter 方法没问题,imo,但我的更新功能给我带来了麻烦。它们看起来几乎都一​​样——我闻到了很多代码冗余的味道。

注意:我要坚持C89!那就是:我不想用C++,也不想用C99、C11。

name几乎所有其他更新功能的更新都是示例性的(参数会有所不同):

ErrorCode updateName(wchar_t name[MAX_NAME_LENGTH]) {
    ErrorCode err = setName(name);
    if (err != ERROR_CODE_NO_ERROR) {
        return err;
    }
    return commit();
}

错误代码在枚举中定义:

/**
 * error codes hinting at the root cause of a failure
 */
typedef enum {
    /** no error */
    ERROR_CODE_NO_ERROR = 0,
    /** win32 specific: OpenFileMappingW failed to return a handle */
    ERROR_CODE_WIN32_NO_HANDLE = 1,
    /** win32 specific: MapViewOfFile failed to return a structure */
    ERROR_CODE_WIN32_NO_STRUCTURE = 2,
    /** unix specific: shm_open returned a negative integer */
    ERROR_CODE_UNIX_NO_HANDLE = 3,
    /** unix specific: mmap failed to return a structure */
    ERROR_CODE_UNIX_NO_STRUCTURE = 4,
    /** shared memory was not initialized */
    ERROR_CODE_NO_MEMORY_WAS_INITIALIZED = 5
} ErrorCode;

我想将原始错误代码一直传递给库函数的调用者,同时避免使用不同的 setXxx 函数和参数编写相同的函数 x 次。我觉得应该有一个更简单的方法。

问题:如何重写更新函数以通过ErrorCode并仍然减少代码冗余并使函数更具可读性/更短?


除此之外,我发现自己开始复制大部分函数文档注释(即 set 的注释与 update 方法的注释有 95% 相同),如果您也知道避免这种情况的最佳实践,请告诉我。

4

1 回答 1

1

如何定义一个函数

int commit_if_ok(int prev_error_code)
{
  if (prev_error_code != ERROR_CODE_NO_ERROR)
    return prev_error_code;
  else
    return commit();
}

并将其用作:

ErrorCode updateName(wchar_t name[MAX_NAME_LENGTH])
{
  return commit_if_ok(setName(name));
}

请注意,如果您的特定编译器具有允许这样做的指令(许多较旧的编译器不允许,但有些允许),则 commit_if_ok 可能是内联函数,但它不应该是宏,因为它两次使用其参数。

于 2013-07-12T17:48:49.800 回答